使用jOOQ查询具有多个IN值的组合键

问题描述

我有以下查询

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();