使用 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>
]
当我 运行 一些代码,
- 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 大师在看这篇文章?
我有没有明显忽略的地方?
如您所说,仅在主键上删除更容易,这是一个很好的做法。只要没有两个叫 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
我想带一个 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>
]
当我 运行 一些代码,
- 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 大师在看这篇文章?
我有没有明显忽略的地方?
如您所说,仅在主键上删除更容易,这是一个很好的做法。只要没有两个叫 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