从ResultSet获取布尔值

20

ResultSet#getBoolean方法在返回null时似乎会返回false。
有没有一种简单的方法从ResultSet中获取一个Boolean(而不是boolean)?

5个回答

19

那我需要使用:Boolean foo = result.getBoolean("bar"); if (result.wasNull()) foo = null; 是吗? - Priv
是的,你可以这样使用它。 - uoyilmaz
谢谢,非常有帮助。 - leole

9
这应该可以运行:
    try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test?serverTimezone=UTC");){

        // create table bool_table (bool_value boolean);
        // insert into bool_table values (null);
        String sql = "SELECT * FROM bool_table";

        try (PreparedStatement preStmt = conn.prepareStatement(sql)){

            try (ResultSet rs = preStmt.executeQuery()) {
                rs.next();

                System.out.println(rs.getObject(1, Boolean.class));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
    } catch (SQLException ex) {
        ex.printStackTrace();
    }

它抛出java.lang.AbstractMethodError。 - Nathan B
@NadavB,这在MySQL中不应该是问题。我添加了一个完整的例子。 - Alexey Soshin
这在我使用postgresql时也发生过。第二个带有wasNull的答案对我很有效。所以也许你的答案只适用于MySQL? - Nathan B
@NadavB,是的,因为原始问题只涉及MySQL。 - Alexey Soshin
1
当数据库列为空时,这也会返回false,这正是OP想要避免的。 - theyuv
这个解决方案对我非常有效,使用AS400/DB2。谢谢Alexey! - jfajunior

4
你可以通过使用ResultSet.getObject()方法并将其转换为Boolean对象来获得期望的结果(即:在列值为空时返回null)。
就像这样:
Boolean someBool = (Boolean) rs.getObject("booleanColumnName");

只要你的列类型对应于布尔值(即:TINYINT(1)),我认为这是安全的,但请测试一下。

这个答案 使用了Integer对象来实现相同的功能。


Integer 无法转换为 Boolean - Alex78191
你正在将 Object 强制转换为 Boolean。https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#getObject(int) - theyuv
Java对象的类型将是与列的SQL类型对应的默认Java对象类型。请了解强制转换。 - Alex78191
1
在Oracle中没有布尔列,但是getBoolean方法可以使用。 - Alex78191

4
resultSet.getObject(1) == null ? null : resultSet.getBoolean(1)

0
你可以使用Java的Optional来实现:
    public static Boolean getNullableBoolean(ResultSet rs, String column) throws SQLException {
        return Optional.ofNullable((Boolean)rs.getObject(column))
                       .map(Boolean::booleanValue).orElse(null);
    }

...

getNullableBoolean(rs, "my_boolean_column")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接