Изучаем Java EE 7 - [94]

Шрифт
Интервал

>SELECT c.address.country, count(c)

>FROM Customer c

>GROUP BY c.address.country

>HAVING c.address.country <> 'Англия'

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 имеется пять отличающихся типов запросов, которые могут быть использованы в коде, причем каждый из них — с разным назначением.

• Динамические запросы — это самая простая форма, куда входит всего лишь строка JPQL-запроса, динамически генерируемого во время выполнения.

• Именованные запросы — являются статическими и неизменяемыми.

• Criteria API — в JPA 2.0 была представлена концепция объектно-ориентированного Query API.

• «Родные» запросы — запросы этого типа пригодны для выполнения «родных» SQL-операторов вместо JPQL-операторов.

• Запросы к хранимым процедурам — JPA 2.1 привносит новый API для вызова хранимых процедур.

Центральной точкой, обуславливающей выбор из этих пяти типов запросов, является интерфейс менеджера сущностей, который обладает несколькими фабричными методами, приведенными в табл. 6.4, возвращая либо интерфейс Query, либо TypedQuery, либо StoredProcedureQuery (TypedQuery и StoredProcedureQuery расширяют Query). Интерфейс Query используется в тех случаях, когда типом результата является Object, а TypedQuery применяется, когда предпочтителен типизированный результат. StoredProcedureQuery задействуется для контроля выполнения запросов к хранимым процедурам.


Таблица 6.4. Методы менеджера сущностей для генерирования запросов
МетодОписание
Query createQuery(String jpqlString)Создает экземпляр Query для выполнения JPQL-оператора для динамических запросов
Query createNamedQuery(String name)Создает экземпляр Query для выполнения именованного запроса (с использованием JPQL или «родного» SQL)
Query createNativeQuery(String sqlString)Создает экземпляр Query для выполнения «родного» SQL-оператора
Query createNativeQuery(String sqlString, Class resultClass)«Родной» запрос, передающий класс ожидаемых результатов
Query createNativeQuery(String sqlString, String resultSetMapping)«Родной» запрос, передающий отображение результирующего набора
TypedQuery createQuery(CriteriaQuery criteriaQuery)Создает экземпляр TypedQuery для выполнения запроса с использованием критериев
TypedQuery createQuery(String jpqlString, Class resultClass)Типизированный запрос, передающий класс ожидаемых результатов
TypedQuery createNamedQuery(String name, Class resultClass)Типизированный запрос, передающий класс ожидаемых результатов
StoredProcedureQuery createStoredProcedureQuery(String procedureName)Создает StoredProcedureQuery для выполнения хранимой процедуры в базе данных
StoredProcedureQuery createStoredProcedureQuery(String procedureName, Class… resultClasses)Запрос к хранимой процедуре, передающий классы, в которые будут отображаться результирующие наборы
StoredProcedureQuery createStoredProcedureQuery(String procedureName, String… resultSetMappings)Запрос к хранимой процедуре, передающий отображение результирующих наборов

Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.