2016-10-24 27 views
1

我想使postgres數據庫表與Jooq記錄列表同步。使用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> 
] 

我會希望發生的是,當我運行一些代碼,

  • 喬 - 史密斯的數據庫行都有它的高度更新
  • 一個新行插入標記泰勒
  • 皮特·瓊斯的數據庫行被刪除

我已成功地創建AF這是前兩部分的一部分,但我堅持第三部分。我希望能有JOOQ一個非常簡單的「一個班輪」,基本上沒有

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

,但我不能制定出相應的Java代碼來做到這一點。

有沒有Jooq-master閱讀此內容?

是否有明顯的東西我看起來很重要?

回答

2

你的查詢可以被翻譯成以下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謂詞度> 1部分:

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

+0

謝謝盧卡斯,再一次! –

1

就像你說的那樣,刪除一個主鍵和一個很好的做法是比較容易的。只要沒有兩個人叫皮特·瓊斯,這樣的事情應該工作:

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