在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()测试是多余的?
教育我们,谢谢
9 回答
当字段值为
NULL
时,ResultSet.getInt
的默认值是返回0
,这也是iVal
声明的默认值 . 在这种情况下,您的测试完全是多余的 .如果你真的想要做一些不同的事情,如果字段值是NULL,我建议:
(编辑为@martin评论如下;写入的OP代码无法编译,因为
iVal
未初始化)另一种方案:
我认为,这是多余的 .
rs.getObject("ID_PARENT")
应返回Integer
对象或null
,如果列值实际为NULL
. 所以甚至应该可以这样做:只需使用ResultSet#getObject()检查字段是否为
null
. 用你想要的任何null-case值替换-1
.或者,如果您可以保证使用正确的DB列类型,以便
ResultSet#getObject()
确实返回Integer
(因此不是Long
,Short
或Byte
),那么您也可以将其强制转换为Integer
.你可以简单地使用AFAIK
即使它是NULL .
为方便起见,您可以在ResultSet周围创建一个包装类,当
ResultSet
通常不会返回null值时返回空值 .只是Java Generics的更新 .
您可以创建一个实用程序方法,以从先前生成的给定ResultSet中检索任何Java类型的可选值 .
不幸的是,getObject(columnName,Class)不返回null,而是返回给定Java类型的默认值,因此需要2次调用
在此示例中,您的代码可能如下所示:
很高兴得到反馈
使用java 8,您可以这样做:
在这种情况下,如果SQL值为NULL,则确保nVal为空(而不是零)
如果您控制SQL,另一种检查的好方法是在int列的查询本身中添加一个默认值 . 然后检查该值 .
例如,对于Oracle数据库,请使用NVL
然后检查
当然,这也是假设存在通常在列中找不到的值 .