データベースに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コードのみに制限されています。
オプション1が最も近い:
_double d = rs.getDouble(1);
if (rs.wasNull()) {
// do something
} else {
// use d
}
_
それはそれほど素晴らしいものではありませんが、それはJDBCです。列がnullの場合、double値は「不良」と見なされるため、データベースで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));
Null許容フィールドを取得するKotlinバージョン:
val parentId = resultSet.getObject("parent_id") as Double?