java - 具有 N 次元组的 jOOQ "IN" 谓词
问题描述
我需要一个WHERE
子句来检查IN
列表的元组:(field1, field2) in (('1', 1), ('2', 2), ('3', 3))
。这是 Postgres 中的有效 SQL。
方言:POSTGRES
jOOQ 版本:3.9.6
这种情况下正确的 jOOQ 语法是什么?
jOOQ 3.9 文档暗示这是可能的,但他们的示例仅给出 1 级:https ://www.jooq.org/doc/3.9/manual/sql-building/conditional-expressions/in-predicate-degree-n/
这段代码给出了我正在寻找的近似值,但我无法获得正确的类型/数据,referenceOrderIdLineNumbers
也无法获得 jOOQ 生成的正确 SQL。
Collection<Row2<String, Integer>> referenceOrderIdLineNumbers = ...
List<Object[]> rows = dsl.select(... , field("count(TABLE3)", Integer.class )
.from(Tables.TABLE1)
.join(Tables.TABLE2).on(Tables.TABLE2.PK1.eq(Tables.TABLE1.PK1))
.join(Tables.TABLE3).on(Tables.TABLE3.PK2.eq(Tables.TABLE2.PK2))
.where(
row(Tables.TABLE1.FIELD1, Tables.TABLE2.FIELD2) // <-- what to
.in(referenceOrderIdLineNumbers) // <-- do here??
)
.groupBy(...)
.fetch();
解决方案
这对我来说是按预期工作的。您可以尝试让 jOOQ 记录它为您生成的 SQL,并尝试直接对您的数据库运行所述 SQL。
参考:
- https://www.jooq.org/doc/3.9/manual/sql-execution/logging/
- https://www.jooq.org/doc/3.9/manual/sql-building/conditional-expressions/in-predicate-degree-n/
Collection<Row2<String, Integer>> field1Field2Collection = new LinkedList<>();
field1Field2Collection.add(row("1", 1));
field1Field2Collection.add(row("2", 2));
field1Field2Collection.add(row("3", 3));
Result<Record2<String, Integer>> field1Field2Results = dsl
.select(Tables.TABLE1.FIELD1, Tables.TABLE2.FIELD2)
.from(Tables.TABLE1)
.join(Tables.TABLE2).on(Tables.TABLE2.PK1.eq(Tables.TABLE1.PK1))
.where(row(Tables.TABLE1.FIELD1, Tables.TABLE2.FIELD2).in(field1Field2Collection))
.fetch();
推荐阅读
- c - 这三个功能是等价的吗?
- rust - 模式 `&Unspecified` 和 `&__Nonexhaustive` 未涵盖
- c# - 需要将具有传递引用的 Nuget 包被本地引用覆盖以进行单元测试
- javascript - 在多个 javascript 项目之间共享 i18n 语言环境的方法
- c# - Soap 服务模型绑定失败
- javascript - 启用 Cors 的 ASP.NET Core API 不起作用
- php - 在 PHP 中使用 DOMDocument 从 SVG 中删除符号元素
- email - 使用邮戳服务设置电子邮件可选预览
- robotframework - AttributeError:“NoneType”对象在机器人框架中没有“解码”属性
- undirected-graph - 如何使用答案集编程从图中提取树?