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 中使用两次的绑定值。