2015-02-09 52 views
1

我有地图结合值的: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仍然非常有用。

回答

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