使用 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();
我有以下查询:
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/
从 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();