2015-02-09 3 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.

Смежные вопросы