2016-10-24 2 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 

(простите за плохую форму с использованием имен, как первичные ключи ....)

У меня также есть список записей Jooq для этой таблицы в моем java-коде. Давайте предположим, что есть две ява записи

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

То, что я хотел бы случиться, когда я запускаю код,

  • База данных строк Джо Смит это высота обновленный
  • Новая строка вставлено для Mark Taylor
  • базы данных строка для Пита Джонса удаляется

мне удалось создать автофокус который делает первые две части, но застрял на третьем. Я надеялся иметь довольно простой «один вкладыш» в JOOQ, который в основном сделал

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

, но я не могу работать, соответствующий Java-код, чтобы сделать это.

Есть ли у вас Jooq-мастера, которые это читают?

Есть ли очевидная вещь, которую я пересматриваю?

ответ

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

спасибо Lukas, еще раз! –

1

Легче просто удалить первичный ключ и передовую практику, как вы сказали. До тех пор, пока нет двух людей, называемых Пит Джонс, что-то вроде этого должно работать:

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