Come faccio a JDBC letto un valore doppio possibilmente nulla da resultSet?
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.
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?