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

使用带有“IN”子句的JDBI绑定数组

姜志
2023-03-14

我试图执行以下代码:

return jdbi.withHandle(
    handle -> handle.createQuery("SELECT * FROM alias WHERE id IN (?)")
        .bind(0, new int[]{1, 2})
        .mapTo(AliasEntry.class)
        .list()
);

得到了一个相当无用的错误:

org.jdbi.v3.core.statement.UnableToExecuteStatementException: org.h2.jdbc.JdbcSQLDataException: Data conversion error converting "[1, 2]"; SQL statement:
SELECT * FROM alias WHERE id IN (?) [22018-200] [statement:"SELECT * FROM alias WHERE id IN (?)", arguments:{positional:{0:[I@52fee500}, named:{}, finder:[]}]

我的代码基于JDBI Developer Guide示例:

handle.createUpdate("insert into groups (id, user_ids) values (:id, :userIds)")
      .bind("id", 1)
      .bind("userIds", new int[] { 10, 5, 70 })
      .execute();

以下代码运行良好:

int id = 1;
handle.createQuery("SELECT * FROM alias WHERE id = ?")
      .bind(0, id)
      .mapTo(AliasEntry.class)
      .findOne()

我做错了什么?

jdbi版本:3.25.0

jdk:16

共有1个答案

商勇
2023-03-14

对于中的子句,您应该在中使用bindList

handle.createQuery("SELECT value FROM items WHERE kind in (<listOfKinds>)")
      .bindList("listOfKinds", keys)
      .mapTo(String.class)
      .list();

// Or, using the 'vararg' definition
handle.createQuery("SELECT value FROM items WHERE kind in (<varargListOfKinds>)")
      .bindList("varargListOfKinds", "user_name", "docs", "street", "library")
      .mapTo(String.class)
      .list();

 类似资料:
  • 问题内容: 我的代码: 始终显示为1的计数,但是当我跳过参数化并仅将变量本身添加到其位置时,我得到了准确的计数。这里发生了什么? 问题答案: 您不能像这样为IN子句绑定参数。$ myArray字符串将仅计为一个值,例如执行以下操作: 即使有三个以逗号分隔的值,数据库也会将它们作为一个字符串值读取。 您需要以惯用的方式手动将IN列表插入查询中。 不幸的是没有其他办法。至少现在(是。

  • 例如,我想做这样的事情: 新建Select().from(Table).where(“id in?”,list).execute()

  • 记录具有id和名称 带有@Convert的DocumentModel 记录转换器 如果recordIds有多个值(例如:docId=1),即使: 嵌套选择不工作 IN子句有和没有()不工作 子句的成员不工作 导致本机SQL直接无法工作 @公式不工作 而且问题似乎是记录应该是单引号-逗号分隔的,而不仅仅是逗号分隔的,因为它们是字符串。(本机SQL查询在这种情况下工作)

  • TLDR;JDBI 注释使用自动生成的类型生成 ,因为生成的类型是包私有的,默认情况下无法使用反射进行访问。 JDBI是不灵活的还是有通过AutoValue的解决方法?(以下是完整的问题) 快速背景 我正在尝试使用JDBI 注释,其类型的源代码是使用AutoValue生成的。 问题是生成的代码看起来像: 请注意,类是包私有的! 现在,如果我尝试使用< code>@BindBean,例如: 因为是包

  • 我正在为一个项目使用JDBI / Dropwizard,希望运行一些简单的查询。我有这样一个疑问: 我在方法中绑定变量,如下所示: 但是,运行时出现以下错误: 我将作为字符串类型的 传递,所以我有点困惑这里发生了什么。有谁JDBI的正确方法?

  • 我有基于spring boot 1.2.3的应用程序。其中一个模型非常具体:包含枚举列表。当我试图调用spring jpa查询时,sql的一部分消失[C.categories IN(:category)被替换为(.IN(?))]。我想这可能是图书馆的一些问题,或者我做错了什么。 你知道怎么解决这个问题吗? 目标模型包含: 枚举模型: