JOOQ "IN" Предикат с кортежами степени N - PullRequest
6 голосов
/ 16 мая 2019

Мне нужно предложение WHERE для проверки кортежей IN списка: (field1, field2) in (('1', 1), ('2', 2), ('3', 3)). Это действительный SQL в Postgres.

Диалект: POSTGRES

JOOQ Версия: 3.9.6

Каков правильный синтаксис jOOQ для этого случая?

Документация jOOQ 3.9 подразумевает, что это возможно, но их пример дает только степень 1: https://www.jooq.org/doc/3.9/manual/sql-building/conditional-expressions/in-predicate-degree-n/

Этот код приблизительно соответствует тому, что я ищу, но я не могу получить правильный тип / данные для referenceOrderIdLineNumbers и не могу получить правильный SQL, сгенерированный jOOQ.

Collection<Row2<String, Integer>> referenceOrderIdLineNumbers = ...
List<Object[]> rows = dsl.select(... , field("count(TABLE3)", Integer.class )
  .from(Tables.TABLE1)
  .join(Tables.TABLE2).on(Tables.TABLE2.PK1.eq(Tables.TABLE1.PK1))
  .join(Tables.TABLE3).on(Tables.TABLE3.PK2.eq(Tables.TABLE2.PK2))
  .where(
    row(Tables.TABLE1.FIELD1, Tables.TABLE2.FIELD2) // <-- what to 
    .in(referenceOrderIdLineNumbers)                // <-- do here??
  )
  .groupBy(...)
  .fetch();

1 Ответ

1 голос
/ 24 мая 2019

Это работает, как предназначено для меня. Вы можете попробовать jOOQ записать SQL, который он генерировал для вас, и попробовать запустить указанный SQL для вашей базы данных напрямую.

Рекомендации:

Collection<Row2<String, Integer>> field1Field2Collection = new LinkedList<>();
field1Field2Collection.add(row("1", 1));
field1Field2Collection.add(row("2", 2));
field1Field2Collection.add(row("3", 3));

Result<Record2<String, Integer>> field1Field2Results = dsl
        .select(Tables.TABLE1.FIELD1, Tables.TABLE2.FIELD2)
        .from(Tables.TABLE1)
        .join(Tables.TABLE2).on(Tables.TABLE2.PK1.eq(Tables.TABLE1.PK1))
        .where(row(Tables.TABLE1.FIELD1, Tables.TABLE2.FIELD2).in(field1Field2Collection))
        .fetch();
...