У меня есть следующий тип в моей базе данных 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 (начиная с версии 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"))
Попробуйте следующее решение. Работал в моем случае.
select.where(ARRAY_FIELD.contains(DSL.cast(DSL.array(VALUE), ARRAY_FIELD.getDataType())));