Как сформировать предложение where в jooq при фильтрации по пользовательскому типу
Я использую postgresql (10.2) с jooq (3.8.7), допустим, у меня есть тип и таблица типа:
CREATE TYPE my_type AS (
id INTEGER,
name TEXT
);
CREATE table my_table (
id INTEGER,
something my_type
);
Тогда как мне получить все записи my_table, где my_table.something.name = 'test', используя jooq? Я пытался сделать что-то вроде этого:
ctx.selectFrom(MY_TABLE)
.where(MY_TABLE.SOMETHING.NAME.eq("test")) \\ SOMETHING is a TableField
... \\ and does not have NAME field
Но это не работает (объяснено в комментариях к коду). Вот что я хочу сделать в jooq:
SELECT * FROM my_table WHERE (something).name = 'test';
1 ответ
Доступ к определенным пользователем атрибутам типов через DSL в настоящее время не реализован в jOOQ 3.11. Соответствующий ожидающий запрос функции находится здесь: https://github.com/jOOQ/jOOQ/issues/228
Как всегда, при работе с таким ограничением вы можете прибегнуть к использованию простых шаблонов SQL:
ctx.selectFrom(MY_TABLE)
.where("{0}.{1} = {2}", MY_TABLE.SOMETHING, MY_TYPE.NAME, DSL.val("test"))
...
Конечно, если вы делаете это чаще, возможно, вы захотите включить такую логику в свой собственный API шаблонизатора на стороне клиента, чтобы улучшить повторное использование похожих шаблонов.