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

Querying a composite key with multiple IN values with jOOQ

我有以下查询:

SELECT *
FROM table
WHERE (id, other_id, status)
IN (
    (1, 'XYZ', 'OK'),
    (2, 'ZXY', 'OK') -- , ...
);

是否可以使用 jOOQ 以类型安全的方式构造此查询,最好不要生成组合键?是否可以使用 jOOQ 3.11 来做到这一点?

抱歉,我的 Google-fu 似乎没有达到标准。这个问题的反面可以在这里找到:

为了完整起见,其他 Google 搜索可能会更有帮助,解决方案是:

// can be populated using DSL.row(...); for each entry
Collection<? extends Row3<Long, String, String>> values = ... 

dslContext.selectFrom(TABLE)
 .where(DSL.row(ID, OTHER_ID, STATUS).in(values))
 .fetch();

相关 jOOQ 文档:https://www.jooq.org/doc/3.14/manual/sql-building/conditional-expressions/in-predicate-degree-n/

already shows how to do this with a 1:1 translation from SQL to jOOQ using the IN predicate for degrees > 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();