web-dev-qa-db-ja.com

Java ResultSetからのnull int値の確認

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() テストが冗長であると思いますか?

私たちを教育し、そしてありがとう

253
ian_scho

フィールド値が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コードはコンパイルされません)

332
Richard

別の解決策:

public class DaoTools {
    static public Integer getInteger(ResultSet rs, String strColName) throws SQLException {
        int nValue = rs.getInt(strColName);
        return rs.wasNull() ? null : nValue;
    }
}
76
Patrice IMBERT

冗長だと思います。列の値が実際に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
  }      
}
28
Andreas_D

フィールドがnullであるか、または ResultSet#getObject() を使用していないかを確認してください。 -1を、必要なNULL値に置き換えます。

int foo = resultSet.getObject("foo") != null ? resultSet.getInt("foo") : -1;

ResultSet#getObject()が実際にInteger(したがってLongShortまたはByteではなく)を返すように正しいDB列型を使用することを保証できる場合は、それをIntegerに型キャストすることもできます。

Integer foo = (Integer) resultSet.getObject("foo");
24
BalusC

私の知る限りあなたは単に使うことができます

iVal = rs.getInt("ID_PARENT");
if (rs.wasNull()) {
  // do somthing interesting to handle this situation
}

nULLであっても.

9
Peter Tillemans

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
}

フィードバックをいただければ幸いです

4
luchoct

便宜上、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;
    }

    // ...

}
1
Jacob Crofts

Java 8ではこれが可能です。

Long nVal = Optional.ofNullable(resultSet.getBigDecimal("col_name"))
                    .map(BigDecimal::longValue).orElse(null));

その場合、SQL値がNULLの場合、nValは必ずNULL(ゼロではない)になります。

1
George

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;
    }
}
0
amine kriaa