如何使用 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
)通常是个好主意。
我想按查询中聚合数组中的特定值过滤结果。
这里稍微描述一下问题。 部分属于花园。园属区,区属省。 用户有多个部分。这些部分属于他们的花园,他们属于他们的地区,他们属于省。
我想获取分区数组中值为 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
)通常是个好主意。