我想将一个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>
]
我想要发生的是当我运行一些代码时,
我设法创建了一个执行前两个部分的功能,但是我坚持第三个部分。我希望有一个非常简单的&#34;一个班轮&#34;在JOOQ基本上做了
delete
from my_table
where (first, last) not in (values ('Joe', 'Smith'), ('Mark', 'Taylor'))
但我无法找到相应的Java代码来完成它。
有没有Jooq大师读这个?
有一个显而易见的事情我过度了吗?
答案 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();