jOOQ - 多重绑定

时间:2015-02-09 21:18:43

标签: java sql binding 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仍然很有用。

1 个答案:

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