Почему JPA CriteriaQuery не предоставляет запрос на обновление?

CriteriaQuery в JPA2.0 предоставляет типобезопасный способ выбора, это здорово. Но мне интересно, почему он не обеспечивает операцию обновления/удаления? Чтобы выполнить массовое обновление/удаление, вам придется вернуться к старому времени написания подверженного ошибкам текста SQL или JPQL. ИМО, CriteriaQuery для обновления/удаления не должно вызывать затруднений, так как обработка причины такая же, как и при выборе.

Надеюсь, это будет реализовано в следующей версии JPA.


person zx_wing    schedule 02.04.2012    source источник
comment
Ваше желание сбылось :) начиная с JPA 2.1 доступно CriteriaUpdate   -  person G. Demecki    schedule 24.09.2014


Ответы (1)


Поскольку JPA является инструментом ORM, целью которого является сопоставление записей базы данных с объектами таким образом, чтобы с записями базы данных можно было манипулировать с помощью языка программирования вместо SQL, он не поощряет использование SQL/HQL/JPQL для выполнения обновления. .

Чтобы предотвратить использование подверженного ошибкам SQL или JPQL для обновления объектов, после того, как вы используете CriteriaQuery для получения списка объектов, вы можете просто прокручивать объекты результатов, а затем изменять свойства объекта одно за другим, чтобы выполнить массовое обновление или удаление. JPA должен уметь обнаруживать изменения, внесенные в эти объекты, и генерировать подходящие SQL-запросы для обновления соответствующих записей в пакете при вызове EntityManager.flush().

person Ken Chan    schedule 02.04.2012
comment
Это звучит разумно. Но это предполагает как минимум две транзакции, если записи огромны, например, удаление одного миллиона записей, такой способ неприемлем. Я просто думаю, что CriteriaQuery уже работал в SQL, который задает некоторые условия, а затем выполняет работу. Почему бы не поддерживать удаление/обновление и в этом стиле. В любом случае, в настоящее время мне приходится использовать простой SQL для пакетного удаления/обновления, если сумма большая. - person zx_wing; 03.04.2012
comment
@zx_wing допустимая точка, поэтому JPA 2.1 представил CriteriaUpdate - person G. Demecki; 24.09.2014