У меня есть такое поджо:
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);




Вы можете просто вернуть дополнительный столбец в свой запрос 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);
Альтернативой является то, что класс сопоставления сначала проверяет, доступен ли столбец, прежде чем пытаться извлечь значение. например Используя findColumn или аналогичный, затем перехватите исключение.
Вы можете получить любые значения, которые захотите, и перед передачей значений в конструктор тегов проверьте их наличие в ResultSet. Если атрибут отсутствует, вы можете передать значение по умолчанию для атрибутов.
Вы можете проверить значение как r.getString("tag_uuid") != null (для строк)
затем tag_uuid = r.getString("tag_uuid")
Спасибо. Это то, что я сейчас делаю, но мне было интересно, нет ли более элегантного способа