Странный перевод jOOQ-запроса для массива содержит функцию

2

У меня есть следующий тип в моей базе данных PostgreSQL:

myoptions text[]

Я использую jOOQ-конвертер, поэтому у меня есть Set как соответствующий тип в моей записи:

Set<String> myoptions

В моем запросе у меня следующее условие:

c.MYOPTIONS.contains(Sets.newHashSet("option1"))

который переводится в SQL следующим образом:

cast("c"."myoptions" as varchar) like ('%' || '[option1]' || '%') escape '!'

Это нормальное поведение?

Я хотел бы иметь что-то вроде:

c.myoptions @> ARRAY['option1']

или же

'option1' = ANY(c.myoptions)

Заранее спасибо за вашу помощь

Теги:
jooq

2 ответа

1
Лучший ответ

В настоящее время jOOQ (начиная с версии 3.8) не распознает ваш настраиваемый тип данных, поскольку все еще является типом данных массива в PostgreSQL, поэтому поведение по умолчанию по умолчанию Field.contains() - то есть то, которое обрабатывает все значения в виде строк.

Для этого я создал запрос функции # 5602. В качестве обходного пути вам может понадобиться сворачивать свой собственный, используя простой SQL:

public static <T, C extends Collection<T>> Condition contains(
    Field<? extends C> left, 
    C right
) {
    return DSL.condition("{0} @> {1}::text[]", left, DSL.val(right, left.getDataType()));
}

... которые вы затем можете использовать как таковые:

contains(c.MYOPTIONS, Sets.newHashSet("option1"))
  • 0
    Спасибо за вашу помощь. Не могли бы вы сказать мне, как использовать вашу статическую функцию?
  • 0
    @Manu: Конечно, я отредактировал свой ответ
Показать ещё 7 комментариев
0

Попробуйте следующее решение. Работал в моем случае.

select.where(ARRAY_FIELD.contains(DSL.cast(DSL.array(VALUE), ARRAY_FIELD.getDataType())));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню