【问题标题】:Use JOOQ to do a delete specifying multiple columns in a "not in" clause使用 JOOQ 在“not in”子句中指定多个列进行删除
【发布时间】:2017-03-05 22:31:45
【问题描述】:

我想将 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-masters 阅读这个?

我忽略了明显的事情吗?

【问题讨论】:

    标签: java sql postgresql jooq


    【解决方案1】:

    您的查询可以翻译成以下 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

    【讨论】:

    • 再次感谢 Lukas!
    【解决方案2】:

    如您所说,仅删除主键和良好做法更容易。只要没有两个叫皮特琼斯的人,这样的事情就应该起作用:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-14
      • 2019-08-10
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 2016-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多