Как применить приведение в выражении значений postgres с помощью JOOQ

#postgresql #jooq

Вопрос:

Для больших условий «в» в Postgres следующие

В (ЗНАЧЕНИЯ («a»),(«b»),(«c»))

может привести к гораздо более эффективным планам запросов, чем

В («а»,»в»,»с»)

В JOOQ я могу выразить это с помощью

 Field f = ...  
Row1[] rows = new Row1[array.length];
for (int i=0;i<array.length;i  )
    rows[i] = DSL.row(array[i]);
Condition c = f.in(DSL.selectFrom(DSL.values(rows)));
 

Но что, если мне нужно будет привести значения? Чтобы быть более конкретным, при сравнении значений со столбцом citext по крайней мере одно из значений должно быть явно приведено в citext, чтобы запрос работал. Пример:

 select distinct "x0"."pk"
from "sometable" as "x0"
 where "x0"."external_shared_id" in ( values 
       ('ext0308174863'::citext),
     ('ext1560238348'))
 

Как я могу написать это с помощью JOOQ?

Ответ №1:

В настоящее время не существует документированного способа создания пользовательских типов данных для использования в приведениях. Вы можете использовать внутренний API на свой страх и риск, который я здесь документировать не буду. Я создал запрос на функцию для создания таких DataType ссылок: https://github.com/jOOQ/jOOQ/issues/11806

Явный запрос функции на citext поддержку находится здесь: https://github.com/jOOQ/jOOQ/issues/5934

Как всегда, когда в jOOQ отсутствует поддержка функций, специфичных для конкретного поставщика, простые шаблоны SQL-ваш друг. Так что просто сделай это:

 rows[i] = row(field("{0}::citext", String.class, val(array[i])));
 

Предполагая следующий статический импорт:

 import static org.jooq.impl.DSL.*;