Como eu no JDBC ler um valor double possivelmente nulo de resultSet?
Pergunta
Eu tenho uma coluna no meu banco de dados que é digitado double
e eu quero ler o valor a partir dele usando um JDBC ResultSet, mas pode ser nulo. Qual a melhor maneira para fazer isto? Eu posso pensar de três opções nenhum dos quais parecem muito bom.
Opção 1: Bad porque o tratamento de exceção detalhado e malcheiroso
double d;
try {
d = rs.getDouble(1);
// do something
} catch(SQLException ex) {
if(rs.wasNull()) {
// do something else
} else {
throw ex;
}
}
Opção 2: Bad porque duas buscas
s = rs.getString(1); // or getObject()
if(s == null) {
// do something else
} else {
double d = rs.getDouble(1);
// do something
}
Opção 3: Bad porque o Java em vez de conversão SQL
s = rs.getString(1); // or getObject()
if(s == null) {
// do something else
} else {
double d = Double.parseDouble(s);
// do something
}
Todas as sugestões sobre qual caminho é melhor, ou há outra maneira superior? E por favor, não diga "Use Hibernate", estou restrito ao código JDBC só aqui.
Solução
A opção 1 é mais próximo:
double d = rs.getDouble(1);
if (rs.wasNull()) {
// do something
} else {
// use d
}
Não é muito agradável, mas isso é JDBC. Se a coluna foi nula, o valor duplo é considerado "mau", então você deve verificar usando wasNull()
cada vez que você ler um primitivo que é anulável no banco de dados.
Outras dicas
Dependendo do seu motorista e banco de dados JDBC, você pode ser capaz de usar um tipo box e elenco:
Double doubleValueOrNull = (Double)rs.getObject(1); // or .getObject("columnName")
Será null
se a coluna foi NULL
.
Tenha o cuidado de verificar isso ainda funciona se você mudar de banco de dados.
Use:
rs.getObject(1)==null?null:rs.getBigDecimal(1).doubleValue()
Ou com java 8 você pode fazer isso:
Double dVal = Optional.ofNullable(resultSet.getBigDecimal("col_name"))
.map(BigDecimal::doubleValue).orElse(null));
Versão Kotlin para recuperar um campo nulo:
val parentId = resultSet.getObject("parent_id") as Double?