Dropwizard JDBI 3 Поле игнорирования ResultSetMapper

У меня есть такое поджо:

private long id;

    @NotEmpty
    @JsonProperty("name")
    private String name;

    @NotEmpty
    @JsonProperty("id")
    private String tagUuid;

    @NotEmpty
    @JsonProperty("archived")
    private boolean archived;

    @NotEmpty
    @JsonProperty("creationDate")
    private DateTime creationDate;

    private Integer count;

    @JsonCreator
    public Tag() {
    }

    public Tag(long id, String tagUuid, String name, boolean archived, Timestamp creationDate, Integer count) {
        this.id = id;
        this.tagUuid = tagUuid;
        this.name = name;
        this.archived = archived;
        this.creationDate = new DateTime(creationDate);
        this.count = count;
    }

Это мой преобразователь набора результатов:

public class TagMapper implements ResultSetMapper<Tag> {

    @Override
    public Tag map(int index, ResultSet r, StatementContext ctx) throws SQLException {
        return new Tag(
                r.getLong("id"),
                r.getString("tag_uuid"),
                r.getString("name"),
                r.getBoolean("archived"),
                r.getTimestamp("creation_date"),
                r.getInt("count")
        );
    }
}

Как я могу получить из базы данных на один столбец меньше. Например, в некоторых запросах я получаю только tagUuid и name, а не другие поля. Но если я сделаю это, я получу следующее исключение: org.skife.jdbi.v2.exceptions.ResultSetException: исключение, возникшее при попытке пройти по набору результатов. Я попытался создать дополнительный конструктор тегов без других параметров.

Это запрос, который я пытаюсь выполнить:

@SqlQuery("SELECT t.id, t.tag_uuid as tag_uuid, t.name, t.archived, t.creation_date FROM tags t WHERE t.tag_uuid = :tag_uuid LIMIT 1")
    public Tag fetchTagByUuid(@Bind("tag_uuid") String tagUuid);
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
1 177
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете просто вернуть дополнительный столбец в свой запрос SQL.

@SqlQuery("SELECT t.id, t.tag_uuid as tag_uuid, t.name, t.archived, " +
          "t.creation_date, 0 AS count FROM tags t " +
          "WHERE t.tag_uuid = :tag_uuid LIMIT 1")
public Tag fetchTagByUuid(@Bind("tag_uuid") String tagUuid);

Спасибо. Это то, что я сейчас делаю, но мне было интересно, нет ли более элегантного способа

ghovat 13.10.2018 14:44

Альтернативой является то, что класс сопоставления сначала проверяет, доступен ли столбец, прежде чем пытаться извлечь значение. например Используя findColumn или аналогичный, затем перехватите исключение.

Hitobat 13.10.2018 14:48

Вы можете получить любые значения, которые захотите, и перед передачей значений в конструктор тегов проверьте их наличие в ResultSet. Если атрибут отсутствует, вы можете передать значение по умолчанию для атрибутов. Вы можете проверить значение как r.getString("tag_uuid") != null (для строк) затем tag_uuid = r.getString("tag_uuid")

Другие вопросы по теме