当前位置: 首页 > 知识库问答 >
问题:

查询中的JDBI绑定值还是null?

房子昂
2023-03-14

JDBI查询需要支持为查询中的多个列设置值或null。

但是,下面是插入空字符串和零,而不是空值:

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记录来自同一个数据库并使用以下行映射器时,这会导致零(对于双精度,尽管字符串似乎映射为null OK):

return Product.newBuilder()
  .setId(rs.getString("id"))
  .setName(rs.getString("name"))
  .setPrice(rs.getDouble("price"))
  .build();

共有1个答案

伯晨
2023-03-14

对于写入,需要直接访问JDBC准备语句的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);
}

对于读取,有必要使用< code>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;
}
 类似资料:
  • 我在这里做错了什么?

  • 问题内容: 如何在jDBI中执行类似的操作? 表: foo(id int,name varchar) 与myBatis中的@SelectProvider相似。 问题答案: 这应该工作: 不要忘记用以下方法注释包含此方法的类: 注解(因为JDBI底层使用Apache StringTemplate进行此类替换)。还要注意,使用此注释,您不能在SQL查询中使用’<’字符而不进行转义(因为它是String

  • 我在Dropwizard中使用JDBI,但在流畅的查询方面遇到了问题。我有一个apiendpoint,如下所示: 我试图避免编写以下3个查询: 这也意味着,我的方法get帐户实现有3个如果检查…昵称和没有电子邮件,电子邮件和没有昵称,电子邮件和昵称,以确定要运行3个查询中的哪一个。如果我要添加另一个查找参数(例如,帐户ID),这意味着我现在需要6个查询(每种可能性1个)和6个if语句来确定要运行哪

  • 我的spring boot applications controller包含一个方法,如下所示,该方法具有可选的 我的问题是,当我用swagger-ui传递查询参数时,这些值不会绑定到可分页对象。我这么说的原因是它打印pageSize为20是否我传递值5作为查询参数。 请求URL:http://localhost:8080/api/markups?offset=2&pageNumber=1&pa

  • 问题内容: 如何在JDBI中使用SQL对象查询进行排序? 我想做类似的事情: 要么 问题答案: 我最近一直在探索与JDBI捆绑在一起的DropWizard,并很快遇到了同样的问题。不幸的是,JDBI的文档乏善可陈(JavaDoc和它的git存储库中的一些示例单元测试并没有单独解决),这令人失望。 这是我根据示例DAO在JDBI的Sql Object API中实现动态排序的结果: @ UseStri

  • 我想运行一个复杂的HQL查询。我的一个参数是< code >集合 类似: spring甚至不能启动< code >???未映射 从表t中选择t,其中size((:codes)) = 0或t.code IN (:codes) 和许多其他人 是否有一种通用方法可以进行此检查并使此查询在不完全构建查询的情况下工作?