jOOQ - 多重绑定
jOOQ - multiple bindings
我有一个绑定值映射:
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
.
是否有替代方法?同一个绑定参数只能使用一次,还是bug?
(我知道这个查询没有多大意义,只是为了演示问题。)
如果我们可以改为执行以下操作,问题可能会得到解决,但这是不可能的,因为 getParams()
returns Param<?>
而不是 Param<Object>
:
for (final Param p : q.getParams().values()) {
if (p.getParamName() != null) {
p.bind(values.get(p.getParamName()));
}
}
更新 - 上面的陈述是不正确的,因为 getParams()
returns 是 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 中使用两次的绑定值。
我有一个绑定值映射:
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
.
是否有替代方法?同一个绑定参数只能使用一次,还是bug?
(我知道这个查询没有多大意义,只是为了演示问题。)
如果我们可以改为执行以下操作,问题可能会得到解决,但这是不可能的,因为 getParams()
returns Param<?>
而不是 Param<Object>
:
for (final Param p : q.getParams().values()) {
if (p.getParamName() != null) {
p.bind(values.get(p.getParamName()));
}
}
更新 - 上面的陈述是不正确的,因为 getParams()
returns 是 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 中使用两次的绑定值。