Изучаем 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 задействуется для контроля выполнения запросов к хранимым процедурам.
Метод | Описание |
---|---|
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 для выполнения запроса с использованием критериев | |
Типизированный запрос, передающий класс ожидаемых результатов | |
Типизированный запрос, передающий класс ожидаемых результатов | |
StoredProcedureQuery createStoredProcedureQuery(String procedureName) | Создает StoredProcedureQuery для выполнения хранимой процедуры в базе данных |
StoredProcedureQuery createStoredProcedureQuery(String procedureName, Class… resultClasses) | Запрос к хранимой процедуре, передающий классы, в которые будут отображаться результирующие наборы |
StoredProcedureQuery createStoredProcedureQuery(String procedureName, String… resultSetMappings) | Запрос к хранимой процедуре, передающий отображение результирующих наборов |
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.