GROUP BY и HAVING могут быть использованы только в операторе SELECT (а не в DELETE или UPDATE).
Массовое удаление
Вы уже знаете, как удалить сущность с помощью метода EntityManager.remove() и выполнить запрос к базе данных для извлечения списка сущностей, которые соответствуют определенным критериям. Чтобы удалить список сущностей, вы можете выполнить запрос, произвести итерацию по этому списку и удалить каждую сущность по отдельности. Хотя это допустимый алгоритм, он ужасен в плане производительности (слишком много раз придется получать доступ к базе данных). Есть более подходящий способ решить эту задачу — произвести массовое удаление.
JPQL выполняет операции массового удаления в отношении множественных экземпляров определенного класса-сущности. Такой подход используется для удаления большого количества сущностей в рамках одной операции. Оператор DELETE похож на оператор SELECT, поскольку может включать ограничительное выражение WHERE и задействовать параметры. В результате возвращается ряд экземпляров сущности, затронутых операцией. Синтаксис оператора DELETE выглядит следующим образом:
DELETE FROM <имя сущности> [[AS] <идентификационная переменная>]
[WHERE <выражение WHERE>]
Чтобы в качестве примера удалить всех клиентов моложе 18 лет, вы можете прибегнуть к массовому удалению с помощью оператора DELETE.
DELETE FROM Customer c
WHERE c.age < 18
Массовое обновление
Для массового обновления сущностей необходимо обратиться к оператору UPDATE, задав значение для одного или нескольких атрибутов субъекта сущности согласно условиям в выражении WHERE. Синтаксис оператора UPDATE выглядит следующим образом:
UPDATE <имя сущности> [[AS] <идентификационная переменная>]
SET <оператор UPDATE> {, <оператор UPDATE>}*
[WHERE <выражение WHERE>]
Вместо того чтобы удалять всех молодых клиентов, для них можно изменить значение firstName на TOO YOUNG с помощью приведенного далее оператора:
UPDATE Customer c
SET c.firstName = 'TOO YOUNG'
WHERE c.age < 18
Запросы
Вы уже видели синтаксис JPQL и поняли, как описывать задачи с использованием разных операторов (SELECT, FROM, WHERE и т. д.). Но как включить JPQL-оператор в свое приложение? Ответ: с помощью запросов. В JPA 2.1 имеется пять отличающихся типов запросов, которые могут быть использованы в коде, причем каждый из них — с разным назначением.
•
•
•
•
•
Центральной точкой, обуславливающей выбор из этих пяти типов запросов, является интерфейс менеджера сущностей, который обладает несколькими фабричными методами, приведенными в табл. 6.4, возвращая либо интерфейс Query, либо TypedQuery, либо StoredProcedureQuery (TypedQuery и StoredProcedureQuery расширяют Query). Интерфейс Query используется в тех случаях, когда типом результата является Object, а TypedQuery применяется, когда предпочтителен типизированный результат. StoredProcedureQuery задействуется для контроля выполнения запросов к хранимым процедурам.