jOOQ - 多个绑定
问题描述:
我有地图结合值的:jOOQ - 多个绑定
final Map<String, Object> values = ...;
之前执行查询,我通过结合参数循环并且它的值绑定如下:
final ResultQuery<Record> q = ...;
for (final Param p : q.getParams().values()) {
if (p.getParamName() != null) {
q.bind(p.getParamName(), values.get(p.getParamName()));
}
}
当相同的结合多次使用,这似乎失败:
final ResultQuery<Record> q = create.select().from(DSL.table("my_table"))
.where((DSL.field("identifier").eq(DSL.param("binding"))
.and(DSL.field("identifier").eq(DSL.param("binding")))));
... code above ...
create.fetch(q);
在生成的查询,仅绑定之一被填写。另一个是null
。
是否有其他方法吗?相同的绑定参数只能使用一次,或者这是一个错误?
(我知道这个查询请求也没有太大的意义,它仅仅用于演示的问题。)
,如果我们能够做到,而不是下面的问题可能是解决了,但它是不可能的,因为getParams()
回报Param<?>
而不是Param<Object>
:
for (final Param p : q.getParams().values()) {
if (p.getParamName() != null) {
p.bind(values.get(p.getParamName()));
}
}
更新 - 上面的说法是不正确的,因为getParams()
返回Map<String, Param>
,而不是Map<String, Collection<Param>>
。尽管直接绑定Param
仍然非常有用。
答
这是jOOQ 3.5.2(#4056)中的错误。
另一个解决方法除了你已经找到了将确保的"binding"
两个实例其实都是同一个,你应该外在化绑定值:
Param<Object> binding = DSL.param("binding");
final ResultQuery<Record> q = create.select().from(DSL.table("my_table"))
.where((DSL.field("identifier").eq(binding)
.and(DSL.field("identifier").eq(binding))));
现在,你会显式创建一个在AST中使用两次的绑定值。