Как построить условие на основе составного типа данных с помощью jOOQ? - PullRequest
0 голосов
/ 30 ноября 2018

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

CREATE VIEW my_view AS
SELECT c.*, CAST(p.* AS parent) AS entity_parent
FROM entity_child c
LEFT JOIN parent p ON c.parent_id = p.id
GROUP BY c.id, p.id;

Мне нужно запросить представление на основе значения сущности / родительского значения.В PostgreSQL это выглядит так:

SELECT *
FROM my_view
WHERE (entity_parent).secret_value = 42;

jOOQ теперь содержит правильный тип данных entity_parent (ParentRecord), но мне не удалось перевести мой запрос.

У кого-нибудь есть идея?

1 Ответ

0 голосов
/ 03 декабря 2018

API jOOQ в настоящее время не позволяет генерировать выражения разыменования элементов UDT из коробки.Соответствующий запрос функции такой: https://github.com/jOOQ/jOOQ/issues/228

Однако, как всегда, вы легко можете обойти такое ограничение в jOOQ API, используя простой шаблонный API SQL: https://www.jooq.org/doc/latest/manual/sql-building/plain-sql-templating

public static <T, U extends UDTRecord> Field<T> dereference(
    Field<? extends U> parent, 
    UDTField<U, T> child
) {
    return DSL.field("({0}).{1}", child.getDataType(), parent, child.getUnqualifiedName());
}

А затем используйте его следующим образом:

ctx.selectFrom(MY_VIEW)
   .where(dereference(MY_VIEW.ENTITY_PARENT, Parent.SECRET_VALUE).eq(42))
   .fetch();
...