繁体   English   中英

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

我为此创建了功能请求#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())));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM