web-dev-qa-db-ja.com

JDBCでは、nullの可能性があるdouble値をresultSetからどのように読み取りますか?

データベースにdoubleと入力された列があり、JDBC ResultSetを使用してその列から値を読み取りたいのですが、nullの場合があります。これを行う最良の方法は何ですか?私は3つのオプションを考えることができます。

オプション1:例外処理の詳細と臭いのために悪い

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

オプション2:2つのフェッチのために悪い

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

オプション3:Java SQL変換ではなく、悪いため

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

どの方法が良いのか、または別の優れた方法はありますか? 「Hibernateを使用する」とは言わないでください。ここではJDBCコードのみに制限されています。

34
Nick Fortescue

オプション1が最も近い:

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

それはそれほど素晴らしいものではありませんが、それはJDBCです。列がnullの場合、double値は「不良」と見なされるため、データベースでnull可能なプリミティブを読み取るたびにwasNull()を使用して確認する必要があります。

55
skaffman

JDBCドライバーとデータベースによっては、ボックス型とキャストを使用できる場合があります。

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

列がnullの場合はNULLになります。

データベースを変更した場合でも、これが機能することを確認してください。

16
artbristol

使用する:

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

またはJava 8でこれを行うことができます:

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

Null許容フィールドを取得するKotlinバージョン:

val parentId = resultSet.getObject("parent_id") as Double?
0
vovahost