使用JOOQ执行删除操作,指定"而不是"子句

时间:2016-10-24 08:05:32

标签: java sql postgresql jooq

我想将一个postgres数据库表与Jooq Records列表同步。

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

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

例如,数据可能是

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

(原谅使用名称作为主键的不良形式......)

我的java代码中也有该表的Jooq Records列表。让我们说有两个java记录

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

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

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

我设法创建了一个执行前两个部分的功能,但是我坚持第三个部分。我希望有一个非常简单的&#34;一个班轮&#34;在JOOQ基本上做了

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

但我无法找到相应的Java代码来完成它。

有没有Jooq大师读这个?

有一个显而易见的事情我过度了吗?

2 个答案:

答案 0 :(得分:4)

您的查询可以转换为以下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度数谓词&gt;的部分。 1:

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

答案 1 :(得分:1)

如上所述,更容易删除主键和良好做法。只要没有两个人叫皮特琼斯,这样的事情应该有效:

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