Javaでは、カラムがプリミティブint型にキャストされているResultSetから、null値をテストしようとしています。
int iVal;
ResultSet rs = magicallyAppearingStmt.executeQuery(query);
if (rs.next()) {
if (rs.getObject("ID_PARENT") != null && !rs.wasNull()) {
iVal = rs.getInt("ID_PARENT");
}
}
上のコードの断片から、これを行うより良い方法があります、そして私は2番目の wasNull() テストが冗長であると思いますか?
私たちを教育し、そしてありがとう
フィールド値がNULL
の場合のResultSet.getInt
のデフォルトは0
を返すことです。これはiVal
宣言のデフォルト値でもあります。その場合あなたのテストは完全に冗長です。
もしあなたが実際にフィールドの値がNULLの場合に何か違うことをしたいのなら、私はお勧めします:
int iVal = 0;
ResultSet rs = magicallyAppearingStmt.executeQuery(query);
if (rs.next()) {
iVal = rs.getInt("ID_PARENT");
if (rs.wasNull()) {
// handle NULL field value
}
}
(以下の@martinコメントとして編集されています。iVal
が初期化されていないため、記述されたOPコードはコンパイルされません)
別の解決策:
public class DaoTools {
static public Integer getInteger(ResultSet rs, String strColName) throws SQLException {
int nValue = rs.getInt(strColName);
return rs.wasNull() ? null : nValue;
}
}
冗長だと思います。列の値が実際にInteger
である場合、rs.getObject("ID_PARENT")
はnull
オブジェクトまたはNULL
を返す必要があります。そのため、以下のようなことも可能になるはずです。
if (rs.next()) {
Integer idParent = (Integer) rs.getObject("ID_PARENT");
if (idParent != null) {
iVal = idParent; // works for Java 1.5+
} else {
// handle this case
}
}
フィールドがnull
であるか、または ResultSet#getObject()
を使用していないかを確認してください。 -1
を、必要なNULL値に置き換えます。
int foo = resultSet.getObject("foo") != null ? resultSet.getInt("foo") : -1;
ResultSet#getObject()
が実際にInteger
(したがってLong
、Short
またはByte
ではなく)を返すように正しいDB列型を使用することを保証できる場合は、それをInteger
に型キャストすることもできます。
Integer foo = (Integer) resultSet.getObject("foo");
私の知る限りあなたは単に使うことができます
iVal = rs.getInt("ID_PARENT");
if (rs.wasNull()) {
// do somthing interesting to handle this situation
}
nULLであっても.
Java Genericsの最新情報です。
以前キャストしたResultSetから任意のJava型のオプション値を取得するためのユーティリティメソッドを作成できます。
残念ながら、getObject(columnName、Class)はnullを返しませんが、与えられたJava型のデフォルト値なので、2回の呼び出しが必要です
public <T> T getOptionalValue(final ResultSet rs, final String columnName, final Class<T> clazz) throws SQLException {
final T value = rs.getObject(columnName, clazz);
return rs.wasNull() ? null : value;
}
この例では、コードは以下のようになります。
final Integer columnValue = getOptionalValue(rs, Integer.class);
if (columnValue == null) {
//null handling
} else {
//use int value of columnValue with autoboxing
}
フィードバックをいただければ幸いです
便宜上、ResultSet
が通常は返さない場合にnull値を返すResultSetを囲むラッパークラスを作成できます。
public final class ResultSetWrapper {
private final ResultSet rs;
public ResultSetWrapper(ResultSet rs) {
this.rs = rs;
}
public ResultSet getResultSet() {
return rs;
}
public Boolean getBoolean(String label) throws SQLException {
final boolean b = rs.getBoolean(label);
if (rs.wasNull()) {
return null;
}
return b;
}
public Byte getByte(String label) throws SQLException {
final byte b = rs.getByte(label);
if (rs.wasNull()) {
return null;
}
return b;
}
// ...
}
Java 8ではこれが可能です。
Long nVal = Optional.ofNullable(resultSet.getBigDecimal("col_name"))
.map(BigDecimal::longValue).orElse(null));
その場合、SQL値がNULLの場合、nValは必ずNULL(ゼロではない)になります。
ResultSetとNumber型の列名を使用してこのメソッドを呼び出すことができます。 Integer値を返すか、nullを返します。データベース内の空の値に対してゼロは返されません。
private Integer getIntWithNullCheck(ResultSet rset, String columnName) {
try {
Integer value = rset.getInt(columnName);
return rset.wasNull() ? null : value;
} catch (Exception e) {
return null;
}
}