Как выбрать несколько строк по составным первичным ключам в JOOQ?

У меня есть таблица с составным первичным ключом. Я хочу найти строки с некоторым набором первичных ключей.

Моя таблица:

create table test_tbl
(
    id_part_1 varchar(36) not null,
    id_part_2 varchar(36) not null,
    some_data text not null,
    constraint test_tbl_pkey
        primary key (id_part_1, id_part_2)
);

Мой SQL запрос:

SELECT * FROM test_tbl
    WHERE (id_part_1, id_part_2) IN (('id_part_1_1', 'id_part_2_1'), ('id_part_1_2', 'id_part_2_2'));

Итак, как реализовать этот запрос с помощью JOOQ? Я не генерирую JOOQ Dao, у меня есть только таблицы JOOQ.


person Denis    schedule 17.03.2020    source источник


Ответы (1)


Как это сделать вручную

Вы можете перевести свой SQL-запрос непосредственно в jOOQ, используя DSL.row() для построения выражения значения строки, а затем:

row(TEST_TBL.ID_PART_1, TEST_TBL.ID_PART_2).in(
  row("id_part_1_1", "id_part_2_1"),
  row("id_part_1_2", "id_part_2_2")
);

См. также руководство по jOOQ. раздел о предикате IN, степень › 1

Используйте встраиваемые ключи

Кроме того, вы можете воспользоваться дополнительной безопасностью типов, предлагаемой новым jOOQ 3.14 <embeddablePrimaryKeys/>, которая позволяет создавать типы записей для всех первичных ключей и ссылающихся на них внешних ключей. Тогда ваш запрос будет выглядеть так:

ctx.select()
   .from(TEST_TBL)
   .where(TEST_TBL.TEST_TBL_PKEY.in(
      new TestTblPkeyRecord("id_part_1_1", "id_part_2_1"),
      new TestTblPkeyRecord("id_part_1_2", "id_part_2_2")
   ))
   .fetch();

Это создает тот же запрос, что и исходный, но делает это безопасно, и вы больше никогда не забудете ключевой столбец. Не только при запросе первичного ключа, но и при присоединении к нему! Изменение ключа приведет к ошибке компиляции:

ctx.select()
   .from(TEST_TBL)
   .join(OTHER_TEST_TBL)
   .on(TEST_TBL.TEST_TBL_PKEY.eq(OTHER_TEST_TBL.TEST_TBL_PKEY.TEST_TBL_FKEY))
   .fetch();

Или неявное соединение будет выглядеть так:

ctx.select(OTHER_TEST_TBL.testTbl().fields(), OTHER_TEST_TBL.fields())
   .from(OTHER_TEST_TBL)
   .fetch();
person Lukas Eder    schedule 18.03.2020