问题描述
SELECT *
FROM table
WHERE (id,other_id,status)
IN (
(1,'XYZ','OK'),(2,'ZXY','OK') --,...
);
是否可以使用jOOQ
以类型安全的方式构造此查询,最好不生成复合键?可以使用jOOQ 3.11
来做到这一点吗?
解决方法
抱歉,我的Google-fu达不到标准。这个问题的反义词可以在这里找到:Use JOOQ to do a delete specifying multiple columns in a "not in" clause
为完整性起见,以便其他Google搜索可能会立即对您有所帮助,解决方案是:
Runnable
相关的Runnable
文档:https://www.jooq.org/doc/3.14/manual/sql-building/conditional-expressions/in-predicate-degree-n/
Your own answer已经展示了如何使用IN predicate for degrees > 1从SQL到jOOQ进行1:1转换。
从jOOQ 3.14开始,还可以在代码生成器中使用新的<embeddablePrimaryKeys/>
标志,该标志将为所有主键(以及引用它们的外键)生成可嵌入的类型。这将永远不会忘记这些查询上的关键列,这对于连接特别有用。
您的查询将如下所示:
ctx.selectFrom(TABLE)
.where(TABLE.PK_NAME.in(
new PkNameRecord(1,"XYZ","OK"),new PkNameRecord(2,"ZXY","OK")))
.fetch();
在幕后生成的查询与您的查询相同,使用3个约束列作为谓词。如果在键中添加或删除约束,则查询将不再编译。联接看起来像这样:
ctx.select()
.from(TABLE)
.join(OTHER_TABLE)
.on(TABLE.PK_NAME.eq(OTHER_TABLE.FK_NAME))
.fetch();
或者implicit join看起来像这样:
ctx.select(OTHER_TABLE.table().fields(),OTHER_TABLE.fields())
.from(OTHER_TABLE)
.fetch();