2009-07-09 11 views
29

J'ai une colonne dans ma base de données qui est tapée double et je veux lire la valeur à l'aide d'un ResultSet JDBC, mais il peut être nul. Quelle est la meilleure façon de faire cela? Je peux penser à trois options dont aucune ne semble très bonne.Comment puis-je lire dans JDBC une double valeur éventuellement nulle à partir de resultSet?

Option 1: Bad parce que la gestion des exceptions verbeux et malodorante

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

Option 2: Bad parce que deux récupérations

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

Option 3: Bad parce que la conversion Java plutôt que SQL

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

Des suggestions sur la façon dont est le meilleur, ou y at-il une autre façon supérieure? Et s'il vous plaît ne dites pas "Use Hibernate", je suis limité au code JDBC seulement ici.

Répondre

43

Option 1 est le plus proche:

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

Ce n'est pas très agréable, mais c'est JDBC. Si la colonne était null, la valeur double est considérée comme "mauvaise", vous devez donc vérifier en utilisant wasNull() chaque fois que vous lisez une primitive qui est nullable dans la base de données.

+9

omg. merci bien que –

+2

note qu'il n'y a pas de sqlexception lors de la récupération des primitives NULL à partir d'un ensemble de résultats. la valeur par défaut pour cette primitive est retournée dans de tels cas (0 pour int, 0.0 pour double, etc ....). D'où pourquoi .wasNull() est un mal nécessaire. – Matt

+1

J'ai eu exactement la même réaction que @JosefPfleger une fois que j'ai réalisé comment fonctionne JDBC à l'égard des zéros. Si vous voulez continuer à utiliser le SQL simple, (et non pas adopter un ORM) et éviter cette débâcle, je suggère d'utiliser 'JdbcTemplate' de Spring, qui s'occupe de toutes ces vérifications nuls pour vous. –

11

En fonction de votre pilote JDBC et base de données, vous pouvez être en mesure d'utiliser un type Boxé et coulé:

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

Il sera null si la colonne était NULL.

Veillez à vérifier cela fonctionne toujours si vous changez de base de données.

+0

Cela ne fonctionne pas pour moi lors de l'interrogation HSQLDB avec la syntaxe Oracle pour les tests. – sravanreddy001

+0

Cela a fonctionné très bien pour moi pour MySQL, et plus agréable pour les yeux que .wasNull() –

+0

ne fonctionnait pas non plus sur Oracle XE. – mdarwin

3

Utilisation:

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

Ou avec java 8 vous pouvez le faire:

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