从Java Resu检查null int值
在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");
}
}
从上面的代码片段,有更好的方法来做到这一点,我假设第二个isNull()测试是多余的?
教育我们,谢谢
ian_scho asked 2019-03-03T17:21:58Z
9个解决方案
305 votes
当字段值为NULL时,iVal的默认值是返回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未初始化)
Richard answered 2019-03-03T17:22:23Z
72 votes
另一种方案:
public class DaoTools {
static public Integer getInteger(ResultSet rs, String strColName) throws SQLException {
int nValue = rs.getInt(strColName);
return rs.wasNull() ? null : nValue;
}
}
Patrice IMBERT answered 2019-03-03T17:22:43Z
26 votes
我认为,这是多余的。 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
}
}
Andreas_D answered 2019-03-03T17:23:11Z
20 votes
只需检查字段是否为ResultSet#getObject()或不使用ResultSet#getObject()。用您想要的任何空值大小替换Integer。
int foo = resultSet.getObject("foo") != null ? resultSet.getInt("foo") : -1;
或者,如果您可以保证使用正确的DB列类型,以便ResultSet#getObject()确实返回Integer(因此不是Long,Short或Byte),那么您也可以将其类型转换为Integer。
Integer foo = (Integer) resultSet.getObject("foo");
BalusC answered 2019-03-03T17:23:46Z
8 votes
你可以简单地使用AFAIK
iVal = rs.getInt("ID_PARENT");
if (rs.wasNull()) {
// do somthing interesting to handle this situation
}
即使它是NULL。
Peter Tillemans answered 2019-03-03T17:24:21Z
1 votes
为方便起见,您可以在ResultSet周围创建一个包装类,当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;
}
// ...
}
Jacob Crofts answered 2019-03-03T17:24:49Z
1 votes
只是Java Generics的更新。
您可以创建一个实用程序方法,以从先前生成的给定ResultSet中检索任何Java类型的可选值。
不幸的是,getObject(columnName,Class)不返回null,而是返回给定Java类型的默认值,因此需要2次调用
public T getOptionalValue(final ResultSet rs, final String columnName, final Class 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
}
很高兴得到反馈
luchoct answered 2019-03-03T17:25:45Z
0 votes
使用java 8,您可以这样做:
Long nVal = Optional.ofNullable(resultSet.getBigDecimal("col_name"))
.map(BigDecimal::longValue).orElse(null));
在这种情况下,如果SQL值为NULL,则确保nVal为空(而不是零)
George answered 2019-03-03T17:26:21Z
-5 votes
如果您控制SQL,另一种检查的好方法是在int列的查询本身中添加一个默认值。 然后检查该值。
例如,对于Oracle数据库,请使用NVL
SELECT NVL(ID_PARENT, -999) FROM TABLE_NAME;
然后检查
if (rs.getInt('ID_PARENT') != -999)
{
}
当然,这也是假设存在通常在列中找不到的值。
Chris answered 2019-03-03T17:27:10Z