jooq - 使用 contains

问题描述 投票:0回答:1

我正在尝试检查某个字段是否位于选择查询的数组中。这是我想要提出的查询:

select item_id, name, desc from item_table where contains(array[24805247, 2156654], item_id); 

适用于 AWS Athena / Presto

jOOQ 文档中针对纯 SQL 模板的第一个示例显示了将对象转换为数组,但我似乎无法实现这一点。

在示例中,

condition("{0} && {1}", array1, array2);

 变为 
ARRAY[1,4,3] && ARRAY[2,1]
。当我尝试使用一个数组时,它仅传递数组中的第一项,而不是转换为数组。

我的数组都是整数:

Integer[] items

这是我尝试过的代码:

var create = DSL.using(SQLDialect.DEFAULT); var query = create.select(item_id, name, desc) .from(table("item_table")) .where("contains({0}, item_id)", items) .getSQL(ParamType.INLINED);
我看到了这个

类似的问题,但是当我将where更改为.where(items.eq(any(item_id)))

时,查询由一堆
item_id = 24805247 or item_id = 2156654
组成。

我希望查询使用像示例中那样的数组,因为最终我将查询大约 30-50 个项目 ID(这是每周一次的后台任务,因此速度不是一个大问题)。

java jooq
1个回答
0
投票
当您应该使用绑定参数标记

{0}

时,您正在使用模板占位符
?
(假设`items确实是一个Java数组):

.where("contains(?, item_id)", items)
或者,如果您更喜欢使用模板占位符,则必须传递 

QueryPart

,例如一个
显式绑定变量:

.where("contains({0}, item_id)", val(items))
    
© www.soinside.com 2019 - 2024. All rights reserved.