数组的 jOOQ 查询的奇怪翻译包含函数

Strange translation of jOOQ query for array contains function

我的 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() 默认行为开始的原因 - 即对待所有值作为字符串。

我创建了 feature request #5602 for this. As a workaround, you might need to roll your own using 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"))

请尝试以下解决方案。在我的案例中有效。

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