2016-06-08 2 views
2

Я хотел бы поставить коллекции/массивы в параметре "IN", но я получилJooq - Простой SQL Параметризованная Array/Список

Когда я использовал массив:

org.jooq.exception.SQLDialectNotSupportedException: Cannot bind ARRAY types in dialect MYSQL  

Когда я использовал список:

org.jooq.exception.SQLDialectNotSupportedException: Type class java.util.Arrays$ArrayList is not supported in dialect DEFAULT 

Вот мой обычный SQL:

String sql = "SELECT SUM(foo.reply = 'Y') yes " + 
      "FROM foo " + 
      "LEFT OUTER JOIN bar " + 
      "ON foo.id = bar.foo_id " + 
      "WHERE " + 
      "foo.id = ? " + 
      "AND foo.some_id IN (?) "; //this is the part I would like to use array or list 

Вот как я исполняю его

dslContext.fetch(sql, val(fooId), val(someIds)) 
        .into(Summary.class); 

ответ

2

Вы не можете сделать это с помощью отдельных переменных связывания (за исключением PostgreSQL с массивами). Но вы можете использовать вложенные простые части SQL запроса в jOOQ как таковой:

String sql = "SELECT SUM(foo.reply = 'Y') yes " + 
      "FROM foo " + 
      "LEFT OUTER JOIN bar " + 
      "ON foo.id = bar.foo_id " + 
      "WHERE " + 
      "foo.id = {0} " + 
      "AND foo.some_id IN ({1}) "; // Use the {0}, {1} placeholders 

И затем

dslContext.fetch(sql, 
       val(fooId), 
       DSL.list(someIds.stream().map(DSL::val).collect(toList()))) 
      .into(Summary.class); 

Смотрите также DSL.list(QueryPart...)

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