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

标签 java sql postgresql jooq

我想将一个 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 中有一个非常简单的“one liner”,基本上可以做到这一点

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

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

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

我是否忽略了一个明显的东西?

最佳答案

您的查询可以转换为以下 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

关于java - 使用 JOOQ 在 "not in"子句中指定多个列进行删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40213470/

相关文章:

使用 JOIN 的 MySQL 查询不使用 INDEX

mysql - 如何转换此 group_by 语句,使其在 DB 而不是 Ruby 上工作?

java - 响应按钮按下而更改布局/框架

java - 如何传递整个 map

sql - 消除 SQL 2000 的 ROW_NUMBER()

mysql - 为大表放置哪些 SQL 索引

Java 打印传入数组的偶数索引处的整数

java - java中数组元素向左移动

postgresql - 使用 SqlAlchemy 和 PostgreSQL 找不到外键

postgresql - (UndefinedFunctionError) 未定义函数 List.Chars.to_charlist/1