我的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)
提前感谢您的帮助
答案 0 :(得分:2)
jOOQ目前(从版本3.8开始)无法识别您的自定义数据类型,因为它仍然是PostgreSQL中的数组数据类型,这就是Field.contains()
默认行为启动的原因 - 即将所有值视为字符串。
我为此创建了feature request #5602。要解决此问题,您可能需要使用plain 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"))
答案 1 :(得分:0)
请尝试以下解决方案。在我的案例中工作。
select.where(ARRAY_FIELD.contains(DSL.cast(DSL.array(VALUE), ARRAY_FIELD.getDataType())));