在Java中,我试图从ResultSet测试空值,其中列被转换为原始int类型。

int iVal;
ResultSet rs = magicallyAppearingStmt.executeQuery(query);
if (rs.next()) {
  if (rs.getObject("ID_PARENT") != null && !rs.wasNull()) {
    iVal = rs.getInt("ID_PARENT");
  }
}

从上面的代码片段中,是否有更好的方法来做到这一点,并且我假设第二个wasNull()测试是多余的?

教育我们,谢谢


当前回答

另一个解决方案:

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

其他回答

我认为这是多余的。rs.getObject("ID_PARENT")应该返回一个Integer对象或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
  }      
}

只需使用ResultSet#getObject()检查字段是否为空。将-1替换为您想要的任何空大小写值。

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

或者,如果你能保证你使用正确的DB列类型,从而ResultSet#getObject()真正返回一个Integer(因此不是长,短或字节),那么你也可以将它类型转换为一个Integer。

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

ResultSet的默认值。当字段值为NULL时,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评论;写的OP代码不会编译,因为iVal没有初始化)

另一种很好的检查方法是,如果您控制了SQL,则在查询本身中为int列添加一个默认值。然后检查这个值。

例如,对于Oracle数据库,使用NVL

SELECT NVL(ID_PARENT, -999) FROM TABLE_NAME;

然后检查

if (rs.getInt('ID_PARENT') != -999)
{
}

当然,这也是在假设有一个值通常不会在列中找到的前提下。

只是Java泛型的更新。

您可以创建一个实用程序方法,从给定的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
}

乐于得到反馈