Man*_*anu 5 java sql postgresql jooq
我的 PostgreSQL 数据库中有以下类型:
myoptions text[]
Run Code Online (Sandbox Code Playgroud)
我使用 jOOQ 转换器,以便在我的记录中有一个 Set 作为相应类型:
Set<String> myoptions
Run Code Online (Sandbox Code Playgroud)
在我的查询中,我有以下条件:
c.MYOPTIONS.contains(Sets.newHashSet("option1"))
Run Code Online (Sandbox Code Playgroud)
在 SQL 中翻译如下:
cast("c"."myoptions" as varchar) like ('%' || '[option1]' || '%') escape '!'
Run Code Online (Sandbox Code Playgroud)
这是正常行为吗?
我想要类似的东西:
c.myoptions @> ARRAY['option1']
Run Code Online (Sandbox Code Playgroud)
或者
'option1' = ANY(c.myoptions)
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的帮助
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()));
}
Run Code Online (Sandbox Code Playgroud)
...然后您可以这样使用:
contains(c.MYOPTIONS, Sets.newHashSet("option1"))
Run Code Online (Sandbox Code Playgroud)