java - Jdbi - 如何在 Java 中绑定(bind)列表参数?

标签 java sql jdbi

我们有一个由 Jdbi (org.skife.jdbi.v2) 执行的 SQL 语句。对于绑定(bind)参数,我们使用 Jdbi 的 bind 方法:

Handle handle = ...
Query<Map<String, Object>> sqlQuery = handle.createQuery(query);
sqlQuery.bind(...)

但是我们在列表中遇到了问题,目前我们正在为此使用 String.format。所以我们的查询看起来像这样:

SELECT DISTINCT
    tableOne.columnOne,
    tableTwo.columnTwo,
    tableTwo.columnThree
FROM tableOne
JOIN tableTwo
    ON tableOne.columnOne = tableTwo.columnOne
WHERE tableTwo.columnTwo = :parameterOne
    AND tableTwo.columnThree IN (%s)

%s 被替换为 String.format 所以我们必须在 java 代码中生成一个合适的字符串。然后在替换所有 %s 之后,我们使用 jdbi 的 bind 方法替换所有其他参数(:parameterOne?).

有没有办法用jdbi替换String.format?有一个方法 bind(String, Object) 但它默认不处理列表/数组。我找到了 this article这解释了如何编写我们自己的工厂来绑定(bind)自定义对象,但看起来需要付出很多努力,尤其是对于应该已经支持的东西。

最佳答案

article you linked还描述了 @BindIn注解。这为列表提供了通用的实现。

@UseStringTemplate3StatementLocator
public class MyQuery {
  @SqlQuery("select id from foo where name in (<nameList>)")
  List<Integer> getIds(@BindIn("nameList") List<String> nameList);
}

请注意,您必须转义所有尖括号 <像这样\\< .之前有关于 SO 的讨论:How to do in-query in jDBI?

关于java - Jdbi - 如何在 Java 中绑定(bind)列表参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32526233/

相关文章:

java - EHCache 2.10 中的缓存层次结构

sql - TOP 与 SET ROWCOUNT

java - 如何在jdbi中实现审计拦截器?

sql - 是否可以执行按位分组功能?

mysql - LEFT JOIN 不为不匹配的行创建 NULL 记录

java - 在使用 DropWizard JDBI 时使用自定义凭据

java - 模拟类(class)的问题

java - 功能分解与柯里化(Currying)与部分应用

java - Struts ajax 404错误

java - 带有自定义异常 Java 的密码检查器无输出