Question

J'ai une colonne dans ma base de données qui est tapé double et je veux lire la valeur de l'aide d'un ResultSet JDBC, mais il peut être nulle. Quelle est la meilleure façon de le faire? Je peux penser à trois options dont aucun ne semble très bon.

Option 1: Mauvais 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 Java plutôt que la conversion SQL

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

Toutes les suggestions sur quelle manière est meilleure, ou est-il une autre façon supérieure? Et s'il vous plaît ne dites pas « Utiliser Hibernate », je suis limité au code JDBC seulement ici.

Était-ce utile?

La solution

Option 1 est le plus proche:

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

Il est pas très agréable, mais c'est JDBC. Si la colonne était nulle, la double valeur est considérée comme « mauvais », de sorte que vous devriez vérifier à l'aide wasNull() à chaque fois que vous avez lu une primitive qui est annulable dans la base de données.

Autres conseils

En fonction de votre pilote JDBC et base de données, vous pourrez peut-être utiliser un type Boxé et casting:

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

Il sera null si la colonne a été NULL.

Prenez soin de vérifier cela fonctionne toujours si vous changez la base de données.

Utilisation:

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

Ou avec java 8 que vous pouvez faire ceci:

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

Version Kotlin pour récupérer un champ annulable:

val parentId = resultSet.getObject("parent_id") as Double?
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top