Domanda

Ho una colonna nel mio database che viene digitato double e voglio leggere il valore da esso utilizzando un ResultSet JDBC, ma può essere null. Qual è il modo migliore per fare questo? Mi vengono in mente tre opzioni nessuno dei quali sembra molto buona.

Opzione 1: Bad perché la gestione delle eccezioni verbose e puzzolente

double d;
try {
   d = rs.getDouble(1);
   // do something
} catch(SQLException ex) {
   if(rs.wasNull()) {
      // do something else
   } else {
     throw ex;
   }
}

Opzione 2: Bad perché due recuperi

s = rs.getString(1); // or getObject()
if(s == null) {
  // do something else
} else {
  double d = rs.getDouble(1);
  // do something
}

Opzione 3: Bad perché Java piuttosto che la conversione SQL

s = rs.getString(1); // or getObject()
if(s == null) {
  // do something else
} else {
  double d = Double.parseDouble(s);
  // do something
}

Qualche suggerimento del modo in cui è meglio, o c'è un altro modo superiore? E per favore non dire "Utilizzare Hibernate", mi ritrassi a codice JDBC solo qui.

È stato utile?

Soluzione

L'opzione 1 è più vicino:

double d = rs.getDouble(1);
if (rs.wasNull()) {
  // do something
} else {
  // use d
}

Non è molto bello, ma questo è JDBC. Se la colonna è stato nullo, il valore doppio è considerato "cattivo", così si dovrebbe verificare utilizzando wasNull() ogni volta che si legge un primitivo che è nullable nel database.

Altri suggerimenti

A seconda del driver JDBC e il database, si può essere in grado di utilizzare un tipo scatolato e cast:

Double doubleValueOrNull = (Double)rs.getObject(1); // or .getObject("columnName")

Sarà null se la colonna è stata NULL.

Fare attenzione e controllare questo funziona ancora se si cambia banca dati.

Usa:

rs.getObject(1)==null?null:rs.getBigDecimal(1).doubleValue()

O con Java 8 si può fare questo:

Double dVal = Optional.ofNullable(resultSet.getBigDecimal("col_name"))
                .map(BigDecimal::doubleValue).orElse(null));

Versione Kotlin per recuperare un campo nullable:

val parentId = resultSet.getObject("parent_id") as Double?
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top