2015-02-09 50 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中使用兩次的綁定值。