使用 JOOQ 在 "not in" 子句中指定多个列进行删除

Use JOOQ to do a delete specifying multiple columns in a "not in" clause

我想带一个 postgres 数据库 table 与 Jooq 记录列表同步。

我有一个 table,每行有一个复合主键和三个其他值

table(k1, k2, v1, v2, v3)

例如,数据可能是

Last, First, Age, Weight, Height
Smith, Joe,  21,  75,     160
Jones, Pete, 23,  80,     180

(请原谅使用名称作为主键的糟糕形式....)

我的 java 代码中还有一个 table 的 Jooq 记录列表。假设有两条 java 条记录

[
   <Smith, Joe, 21, 75, 180>,
   <Taylor, Mark, 54, 90, 170> 
]

当我 运行 一些代码,

我已经设法创建了一个执行前两部分的函数,但在第三部分卡住了。我希望在 JOOQ 中有一个非常简单的 "one liner",基本上

delete 
from my_table 
where (first, last) not in (values ('Joe', 'Smith'), ('Mark', 'Taylor')) 

但我无法计算出相应的 Java 代码来执行此操作。

有没有 Jooq 大师在看这篇文章?

我有没有明显忽略的地方?

如您所说,仅在主键上删除更容易,这是一个很好的做法。只要没有两个叫 pete jones 的人,这样的事情就应该有效:

dsl.deleteFrom(MY_TABLE)
 .where(MY_TABLE.first.eq("pete").and(MY_TABLE.last.eq("jones")).execute();

您的查询可以翻译成以下 jOOQ 代码:

// Assuming this:
import static org.jooq.impl.DSL.*;

using(configuration)
   .deleteFrom(MY_TABLE)
   .where(row(MY_TABLE.FIRST, MY_TABLE.LAST).notIn(
        row("Joe", "Smith"),
        row("Mark", "Taylor")
   ))
   .execute();

这是使用DSL.row()构造行值表达式。请注意 ROW 是 PostgreSQL 中的可选关键字。您刚刚在 SQL 示例中忽略了它。

另请参阅手册中有关度数 > 1 的 IN 谓词的部分:

http://www.jooq.org/doc/latest/manual/sql-building/conditional-expressions/in-predicate-degree-n