どのように私は、JDBCでたresultSetからnullの可能性がdouble値を読みますか。

StackOverflow https://stackoverflow.com/questions/1103460

  •  12-09-2019
  •  | 
  •  

質問

私は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
}

の方法が優れている、または別の優れた方法がされている任意の提案ですか?そして、私はここでしかJDBCコードに制限しています「利用休止」を言わないでください。

役に立ちましたか?

解決

オプション1は最も近います:

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

これは非常にいいではないのですが、それはJDBCです。列がnullだった場合、あなたはそれは、データベース内のNULL可能である原始的な読みwasNull()を毎回使用して確認する必要がありますので、二重の値は、「悪い」と見なされます。

他のヒント

あなたのJDBCドライバとデータベースによっては、箱入りタイプとキャストを使用することができるかもしれ

Double doubleValueOrNull = (Double)rs.getObject(1); // or .getObject("columnName")
列がnullれた場合は、

これはNULLされます。

データベースを変更した場合、これはまだ動作をチェックするように注意してください。

使用します。

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

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

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

KotlinのバージョンがNULL可能フィールドを取得します:

val parentId = resultSet.getObject("parent_id") as Double?
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top