当前位置: 首页 > 知识库问答 >
问题:

使用JOOQ执行删除操作,在“not in”子句中指定多列

欧阳衡
2023-03-14

我想将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大师在读这篇文章?

有什么明显的事情我看过头了吗?

共有2个答案

文志学
2023-03-14

正如你所说的那样,删除主键更容易,这是一种很好的做法。只要没有两个叫皮特·琼斯的人,这样的事情就应该奏效:

dsl.deleteFrom(MY_TABLE)
 .where(MY_TABLE.first.eq("pete").and(MY_TABLE.last.eq("jones")).execute();
易博文
2023-03-14

您的查询可以转换为以下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()来构造行值表达式。请注意,行是PostgreSQL中的可选关键字。您恰好在SQL示例中省略了它。

另请参阅手册中关于度的IN谓词的部分

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

 类似资料:
  • 问题内容: 我想将Postgres数据库表与Jooq记录列表同步。 我有一个包含复合主键和每行中其他三个值的表 例如,数据可能是 (请使用名称作为主键的不良形式。。。) 我的Java代码中也有该表的Jooq记录列表。假设有两个Java记录 我想发生的是当我运行一些代码时, Joe Smith的数据库行的高度已更新 将为Mark Taylor插入新行 Pete Jones的数据库行已删除 我设法创建

  • 我正在为一个SQL的实现工作,它应该在Where和Having子句之间使用联合操作来显示结果。例如, sql语句的目的是返回同时满足where和having条件的结果集。 resultset1<=select*from table1,其中col1='get';resultset2<=select*from table1 group by col2 avg(col3)>30 final result

  • 问题内容: 我在Windows上工作。我想每10秒执行一次函数foo()。 我该怎么做呢? 问题答案: 在的末尾,创建一个在10秒后Timer调用自身的。 因为,Timer创建一个新的thread要调用。 你可以做其他事情而不会被阻止。

  • 本文向大家介绍使用Iterator删除List中的多个元素操作,包括了使用Iterator删除List中的多个元素操作的使用技巧和注意事项,需要的朋友参考一下 今天在写代码时要删除List中的多个元素时犯了一个很搞笑的错误,等效的就是以下代码 运行后发现只能删除“1”这个元素,“2”删除不掉,后来才发现判断的时候如果第一个条件不满足,iterator.next()这个方法又会执行一遍,相当于已经不

  • 运算操作是在Java代码中执行还是在Mysql的where子句中执行 假如age建立了索引,现在要对所有要查询的age进行一个加一操作,那么这个操作是放在Java代码中好还是SQL语句中好 放在SQL语句时的Mybatis代码 本来是觉得直接放在SQL语句中就行,但想着如果在where子句中进行表达式操作会造成索引失效,就在考虑

  • 问题内容: 我是SSH和JSch的新手。当我从客户端连接到服务器时,我想做两个任务: 上传文件(使用) 执行命令,例如创建目录,以及搜索MySQL数据库 目前,我正在使用两个单独的Shell登录名来执行每个任务(实际上我还没有开始对MySQL查询进行编程)。 对于上传,相关代码为 而对于我的命令 我应该在第一个频道之后断开会话,然后再打开第二个频道吗?还是完全关闭会话并打开一个新会话?如我所说,我