JPQL — обновление с несколькими условиями where

Поддерживает ли JPQL следующее обновление?

Update Person p set p.name = :name_1 where p.id = :id_1,
                    p.name = :name_2 where p.id = :id_2,
                    p.name = :name_3 where p.id = :id_3

Если нет, то есть ли альтернативы? Я попробовал это сам. Но createQuery вернул null.


person Kevin Rave    schedule 10.07.2013    source источник
comment
Нет, я не думаю, вам нужно 3 обновления JPA для 3 обновлений SQL.   -  person    schedule 11.07.2013


Ответы (1)


Выражение case поддерживается в JPA 2.0. Я предоставил псевдокод, могу внести соответствующие изменения.

  • Вы можете попробовать запрос JPQL ниже, используя CASE.

    Update Person p set p.name = CASE WHEN (p.id = :id1) THEN :name_1 WHEN (p.id = :id2) THEN :name_2 WHEN (p.id = :id3) THEN :name_3 END

    general_case_expression::= CASE WHEN условное_выражение THEN скалярное_выражение ELSE скалярное_выражение END

  • В противном случае можно попробовать Criteria API для построения запроса.

    when(условие выражения, результат R) : добавьте предложение when/then в выражение case.

    criteriaBuilder.selectCase().when(criteriaBuilder.equal(person.get("id"), id1), name_1);

person Nayan Wadekar    schedule 11.07.2013
comment
@KrantMin Сервер будет просматривать каждую строку только один раз для выражения CASE, что намного лучше, чем выполнение отдельных запросов для каждого условия. - person Nayan Wadekar; 12.07.2013