如何解决查询中的 JDBI 绑定值或空值?
但是,以下是插入空字符串和零,而不是空值:
handle
.createUpdate("REPLACE INTO products(id,name,price) VALUES (:id,:name,:price)")
.bind("id",product.getId())
.bind("name",product.getName())
.bind("price",product.getPrice())
.execute();
此外,当我从同一个数据库中 SELECT
记录并使用以下行映射器时,这会导致零(对于 Double,虽然 String 似乎映射为 null OK):
return Product.newBuilder()
.setId(rs.getString("id"))
.setName(rs.getString("name"))
.setPrice(rs.getDouble("price"))
.build();
解决方法
为了写入,需要直接访问JDBC Prepared statement的setNull方法:
var stmt = handle
.createUpdate("REPLACE INTO products(id,name,price) VALUES (:id,:name,:price)")
.bind("id",deal.getId());
bindValueOrNull(stmt,"name",product.getName());
bindValueOrNull(stmt,"price",product.getPrice());
stmt.execute();
/**
Bind a non-null value to the named query parameter,or else SQL Types.NULL value
@param stmt being prepared
@param key to bind
@param value or null
*/
private void bindValueOrNull(Update stmt,String key,@Nullable Object value) {
if (Objects.nonNull(value))
stmt.bind(key,value);
else
stmt.bindNull(key,Types.NULL);
}
为了读取,需要使用getObject
方法进行空检查:
return Product.newBuilder()
.setId(rs.getString("id"))
.setName(rs.getString("name"))
.setPrice(getDoubleOrNull(rs,"price"))
.build();
/**
Get Double value,or null,from a result set
@param rs result set
@param key of column
@return Double or null
*/
@Nullable
private static Double getDoubleOrNull(ResultSet rs,String key) throws SQLException {
return Objects.nonNull(rs.getObject(key)) ? rs.getDouble(key) : null;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。