我们有一个由 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/