2009-07-09 5 views
29

Ho una colonna nel mio database che è stata digitata double e voglio leggerne il valore utilizzando un ResultSet JDBC, ma potrebbe essere nullo. Qual è il modo migliore per fare questo? Posso pensare a tre opzioni nessuna delle quali sembra molto buona.Come faccio a leggere in JDBC un possibile doppio valore null da resultSet?

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é la conversione Java piuttosto che SQL

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

Qualche suggerimento su quale strada è migliore o c'è un altro modo migliore? E per favore non dire "Usa Hibernate", sono limitato al codice JDBC solo qui.

risposta

43

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 era nullo, il doppio valore è considerato "cattivo", quindi è necessario verificare utilizzando wasNull() ogni volta che si legge una primitiva che è nullable nel database.

+9

omg. grazie però –

+2

nota che non esiste alcuna sqlexception quando si recuperano primitive null da un set di risultati. il valore predefinito per quella primitiva viene restituito in questi casi (0 per int, 0.0 per doppio, ecc ....). Quindi perché .wasNull() è un male necessario. – Matt

+1

Ho avuto la stessa identica reazione di @JosefPfleger una volta che ho realizzato come funziona vanilla JDBC riguardo ai null. Se si desidera continuare a utilizzare l'SQL semplice, sebbene (al contrario dell'adozione di un ORM) ed evitare del tutto questa debacle, suggerisco di usare 'JdbcTemplate 'di Spring, che si prende cura di tutti quei fastidiosi controlli nulli per voi. –

11

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 era NULL.

Fare attenzione a verificare che funzioni ancora se si cambia database.

+0

Questo non funziona per me quando si esegue una query su HSQLDB con la sintassi di Oracle per i test. – sravanreddy001

+0

Questo ha funzionato bene per me per MySQL e più bello per gli occhi rispetto a .wasNull() –

+0

anche non funziona su Oracle XE. – mdarwin

3

Usa:

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

O con Java 8 si può fare questo:

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