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

将in子句中的字符串列表与JDBI一起使用

邢高澹
2023-03-14

我正在为一个项目使用JDBI / Dropwizard,希望运行一些简单的查询。我有这样一个疑问:

私有静态最终字符串GET_STUFF="SELECT*from mytable WH的状态"

我在方法中绑定变量,如下所示:

@Mapper(MyType.class)
@SqlQuery(GET_STUFF)
public MyType getStuff(@Bind(desiredState) List<String> states);

但是,运行时出现以下错误:

org.skife.jdbi.v2.exceptions.UnableToCreateStatementException: 
Exception while binding 'desiredState'....
Caused by: org.postgresql.util.PSQLException: Can't infer the SQL type to use for an instance of java.util.ArrayList. Use setObject() with an explicit Types value to specify the type to use.

我将状态作为字符串类型的 ArrayList 传递,所以我有点困惑这里发生了什么。有谁知道使用JDBI的正确方法?

共有3个答案

岑炯
2023-03-14
@SqlQuery("SELECT ... WHERE xxx in (<uids>)")

@BindIn(value = "uids", onEmpty = BindIn.EmptyHandling.VOID) List<String> ids

别忘了给你的课做注解

@UseStringTemplate3StatementLocator
袁元明
2023-03-14

以下是对我有用的方法(JDBI 3.1.1):

import org.jdbi.v3.sqlobject.customizer.BindList;
import org.jdbi.v3.sqlobject.statement.SqlUpdate;

public interface JdbiRoom {
    @SqlUpdate("update Room set available = 0 where id in (<roomIds>)")
    int markRoomsAsUnavailable(@BindList("roomIds") List<Long> roomIds);
}

此外,我们发现< code>@BindIn不能很好地与< code > @ UseStringTemplateSqlLocator 注释配合使用,因此在使用命名查询时,必须将< code>roomIds作为查询参数传递(参见https://github.com/jdbi/jdbi/issues/1131 ),以了解详细信息:

markRoomsAsUnavailable(roomIds) ::= <<
    update rooms set available = 0 where id in (<roomIds>)
>>
益绯辞
2023-03-14

使用注释@BindIn而不是@Bind。此外,<code>:desiredState</code>应写成<code>

 类似资料:
  • 问题内容: 我正在使用PDO来执行一条语句,该语句使用将数组作为其值的子句: 上面的代码工作得很好,但是我的问题是为什么不能: 此代码将返回等于(1)中第一项的项目,但不返回数组(2和3)中的其余项目。 问题答案: PDO不适用于此类情况。您需要动态创建带有问号的字符串并将其插入查询中。 如果查询中还有其他占位符,则可以使用以下方法(代码取自我的PDO教程): 您可以使用函数将所有变量连接到单个数

  • 问题内容: 我在Python2.6.5中构造了一个字符串,该字符串将具有不同数量的标记,这些标记与list中的条目数匹配。我需要写出格式化的字符串。以下内容不起作用,但表示我要执行的操作。在此示例中,有三个标记,并且列表具有三个条目。 我希望输出字符串为: 问题答案: print s % tuple(x) 代替

  • 问题内容: 我知道更新语句将不起作用,因为ID是INT类型,并且我正在那里替换varachar值。我如何更改查询,以便它实际上像这样执行? 谢谢你 问题答案: Op没有提到数据库,因此我将仅使用SQL Server,因为问题中的示例SQL看起来像TSQL。在SQL Server中有很多分割字符串的方法。本文介绍了几乎每种方法的优点和缺点: Erland Sommarskog撰写的“当表值参数无法剪

  • 问题内容: 我有一个List(Of String),它对应于我们数据库表中的“类型”。 我们正在使用DB2 ADO.NET提供程序,而我的最终查询需要看起来像这样: 过去,我使用ForEach循环构建了查询参数/主机变量的列表,但是我真的很想找出一种在一行中构建它们的方法。当然,我可以连接所有字符串,但是加上“ @”和递增数字会让我头疼。 有人对如何执行此操作有任何想法吗? 问题答案: 不会像这样

  • 我试图执行以下代码: 得到了一个相当无用的错误: 我的代码基于JDBI Developer Guide示例: 以下代码运行良好: 我做错了什么? jdbi版本:3.25.0 jdk:16

  • 我可以使用注释将jdbi查询的结果映射到我感兴趣的bean,如下所示: 如果应用程序中使用的实例尚未注册到任何自定义映射器中,则此操作很好。 此映射器在应用程序开始时注册到实例,如下所示: 重写方法,并提供逻辑将任何类型的结果从数据库转换为相关的bean类型。正是这个uber转换器负责整个应用程序中所有DB到POJO的转换。 我的问题是:有没有一种方法可以告诉继续使用这个将结果从数据库转换为所有类