一尘不染

使用JOOQ进行删除,在``ot in''子句中指定多个列

sql

我想将Postgres数据库表与Jooq记录列表同步。

我有一个包含复合主键和每行中其他三个值的表

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

例如,数据可能是

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

(请使用名称作为主键的不良形式。。。)

我的Java代码中也有该表的Jooq记录列表。假设有两个Java记录

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

我想发生的是当我运行一些代码时,

  • Joe Smith的数据库行的高度已更新
  • 将为Mark Taylor插入新行
  • Pete Jones的数据库行已删除

我设法创建了一个执行前两部分的功能,但是卡在了第三部分上。我希望在JOOQ中有一个非常简单的“一个班轮”,基本上

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

但我无法计算出相应的Java代码来做到这一点。

有任何Jooq大师在阅读此书吗?

我有明显的事情要注意吗?


阅读 165

收藏
2021-03-08

共1个答案

一尘不染

您的查询可以转换为以下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示例中忽略了它。

另请参见手册中有关IN度数大于1的谓词的部分:

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

2021-03-08