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.

Foi útil?

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?
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top