从 ResultSet 获取布尔值
Posted
技术标签:
【中文标题】从 ResultSet 获取布尔值【英文标题】:Getting Boolean from ResultSet 【发布时间】:2016-09-18 18:22:00 【问题描述】:ResultSet#getBoolean 为 null 时似乎返回 false。
有没有一种简单的方法可以从ResultSet
获得Boolean
(不是boolean
)?
【问题讨论】:
【参考方案1】:您可以在调用 getBoolean 后调用 wasNull。这里解释一下:https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#wasNull%28%29
【讨论】:
所以我必须使用:Boolean foo = result.getBoolean("bar"); if (result.wasNull()) foo = null;
?
是的,你可以这样使用。
谢谢,帮了大忙【参考方案2】:
这应该可行:
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 @NadavB,不应该这样,至少对于 MySQL。我添加了一个完整的示例。 postgresql 发生在我身上。 wasNull 的第二个答案对我来说很好。所以也许你的答案只适用于 mySQL? @NadavB,是的,因为最初的问题仅与 MySQL 有关。 当 DB 列为空时,这也将返回 false,这是 OP 试图避免的。【参考方案3】:您应该通过使用ResultSet.getObject()
并转换为Boolean
对象来获得所需的结果(即:当列值为空时为空)。
像这样:
Boolean someBool = (Boolean) rs.getObject("booleanColumnName");
我认为这是安全的,只要你的列类型对应于布尔值(即:TINYINT(1)
),但测试一下。
This answer 做同样的事情,但使用 Integer
对象。
【讨论】:
Integer
不能转换为 Boolean
。
您将Object
投射到Boolean
。 docs.oracle.com/javase/7/docs/api/java/sql/…
The type of the Java object will be the default Java object type corresponding to the column's SQL type
。阅读有关投射的信息。
Oracle 中没有布尔列,但 getBoolean 方法有效。【参考方案4】:
resultSet.getObject(1) == null ? null : resultSet.getBoolean(1)
【讨论】:
以上是关于从 ResultSet 获取布尔值的主要内容,如果未能解决你的问题,请参考以下文章