JPA / JPQL - массовое обновление - PullRequest
4 голосов
/ 03 марта 2011

Я должен выполнить массовое обновление таблицы. Делаем быстрый пример:

 UPDATE Book b SET b.amount = b.amount + 1 WHERE b IN ( :books )

Проблема в том, что b.amount может быть либо значением NULL, либо int, и если значение NULL, оно должно вести себя так, как b.amount будет равно 1.

Есть ли в JPA / JPQL какие-либо «приведения» или каким-либо другим способом обойти эту проблему,

Заранее спасибо,

С уважением, P

Ответы [ 3 ]

7 голосов
/ 03 марта 2011

Вы должны быть в состоянии использовать COALESCE:

UPDATE Book b SET b.amount = COALESCE(b.amount, 1) + 1 WHERE b IN ( :books ) 
1 голос
/ 03 марта 2011

Сначала я бы исправил значения NULL отдельным запросом:

UPDATE Book set b.amount = 0 WHERE b.amount IS NULL

, а также сделал бы невозможным вставку null, если это не является допустимым значением для вашей логики.Например имейте это @Column(nullable=false)

0 голосов
/ 01 апреля 2013

Я использовал следующий способ для получения соединения JDBC от текущего поставщика JPA.

SessionImplementor si = (SessionImplementor) em.unwrap(Session.class);
Connection connection = si.getJdbcConnectionAccess().obtainConnection();
PreparedStatement pstmt = connection.prepareStatement("...");
// Do something
pstmt.addBatch();
pstmt.executeBatch();
si.getJdbcConnectionAccess().releaseConnection(connection);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...