如何使用 JOOQ 检查聚合数组中的特定元素来获取结果集?

How to get result set by checking a specific element in an aggregated array using JOOQ?

我想按查询中聚合数组中的特定值过滤结果。

这里稍微描述一下问题。 部分属于花园。园属区,区属省。 用户有多个部分。这些部分属于他们的花园,他们属于他们的地区,他们属于省。

我想获取分区数组中值为 2 的用户 ID。 我尝试使用任何运算符,但它无法正常工作。 (语法错误) 任何帮助将不胜感激。

ps: 这可以用普通的 SQL

来写
rs = dslContext.select(
                        field("user_id"),
                        field("gardens_array"),
                        field("province_array"),
                        field("district_array"))
                .from(table(select(
                        arrayAggDistinct(field("garden")).as("gardens_array"),
                        arrayAggDistinct(field("province")).as("province_array"),
                        arrayAggDistinct(field("distict")).as("district_array"))
                                .from(table("lst.user"))
                                .leftJoin(table(select(
                                        field("section.user_id").as("user_id"),
                                        field("garden.garden").as("garden"),
                                        field("garden.province").as("province"),
                                        field("garden.distict").as("distict"))
                                        .from(table("lst.section"))
                                        .leftJoin("lst.garden")
                                        .on(field("section.garden").eq(field("garden.garden")))
                                        .leftJoin("lst.district")
                                        .on(field("district.district").eq(field("garden.district")))).as("lo"))
                                .on(field("user.user_id").eq(field("lo.user_id")))
                                .groupBy(field("user.user_id"))).as("joined_table"))
                .where(val(2).equal(DSL.any("district_array"))
                .fetch()
                .intoResultSet();

您的代码正在调用 DSL.any(T...),它对应于 PostgreSQL 中的表达式 any(?),在您的例子中绑定值是 String[]。但是您不希望 "district_array" 成为绑定值,您希望它成为列引用。因此,要么将 arrayAggDistinct() 表达式分配给局部变量并重用它,要么 re-use 您的 field("district_array") 表达式或复制它:

val(2).equal(DSL.any(field("district_array", Integer[].class)))

请注意,在使用 plain SQL templating API 或更好的情况下,使用代码生成器时,明确数据类型(例如 Integer[].class)通常是个好主意。