Frage

Ich habe eine Spalte in meiner Datenbank, die double eingegeben wird, und ich mag den Wert aus es mit einem JDBC ResultSet lesen, aber es kann null sein. Was ist der beste Weg, dies zu tun? Ich kann mich drei Optionen von denen keine scheint sehr gut.

Option 1: Bad, weil die Ausnahmebehandlung ausführlich und stinkende

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

Option 2: Schlecht, weil zwei Abholungen

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

Option 3: Bad, weil Java anstatt SQL Umwandlung

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

Irgendwelche Vorschläge auf dem Weg ist besser, oder gibt es eine andere Art und Weise überlegen? Und bitte sagen Sie nicht „Use Hibernate“, ich JDBC-Code beschränkt bin nur hier.

War es hilfreich?

Lösung

Option 1 am nächsten ist:

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

Es ist nicht sehr schön, aber das ist JDBC. Wenn die Spalte null ist, wird der doppelte Wert „schlecht“ betrachtet, so sollten Sie wasNull() jedes Mal überprüfen, indem Sie lesen ein primitiv, dass NULL festlegbare in der Datenbank ist.

Andere Tipps

Je nach JDBC-Treiber und Datenbank, können Sie in der Lage sein, einen Box-Typen und Guss zu verwenden:

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

Es wird null werden, wenn die Spalte NULL wurde.

Achten Sie darauf, dies noch zu überprüfen funktioniert, wenn Sie Datenbank ändern.

Verwendung:

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

oder mit Java 8 Sie können dies tun:

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

Kotlin Version ein Nullable-Feld abrufen

val parentId = resultSet.getObject("parent_id") as Double?
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top