首页 文章

从Java ResultSet检查null int值

提问于
浏览 889 次
233

在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 回答

  • 1

    当字段值为 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评论如下;写入的OP代码无法编译,因为 iVal 未初始化)

  • 27

    另一种方案:

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

    我认为,这是多余的 . 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
      }      
    }
    
  • 72

    只需使用ResultSet#getObject()检查字段是否为 null . 用你想要的任何null-case值替换 -1 .

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

    或者,如果您可以保证使用正确的DB列类型,以便 ResultSet#getObject() 确实返回 Integer (因此不是 LongShortByte ),那么您也可以将其强制转换为 Integer .

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

    你可以简单地使用AFAIK

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

    即使它是NULL .

  • 0

    为方便起见,您可以在ResultSet周围创建一个包装类,当 ResultSet 通常不会返回null值时返回空值 .

    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

    只是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
    }
    

    很高兴得到反馈

  • 307

    使用java 8,您可以这样做:

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

    在这种情况下,如果SQL值为NULL,则确保nVal为空(而不是零)

  • -5

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

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

    SELECT NVL(ID_PARENT, -999) FROM TABLE_NAME;
    

    然后检查

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

    当然,这也是假设存在通常在列中找不到的值 .

相关问题