我有一个绑定值的地图:
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
仍然很有用。
答案 0 :(得分:0)
这是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中使用两次的绑定值。