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

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

FROM

Оператор FROM определяет сущности путем объявления идентификационных переменных. Идентификационная переменная, или псевдоним, — это идентификатор, который может быть использован в других операторах (SELECT, WHERE и т. д.). Синтаксис оператора FROM включает сущность и псевдоним. В приведенном далее примере Customer является сущностью, а c — идентификационной переменной:

>SELECT c

>FROM Customer c

WHERE

Оператор WHERE состоит из условного выражения, используемого для ограничения результатов выполнения оператора SELECT, UPDATE или DELETE. Оператор WHERE может быть простым выражением либо набором условных выражений, применяемых для фильтрации результатов запроса.

Самый простой способ ограничить результаты запроса — использовать атрибут сущности. Например, приведенный далее запрос обеспечивает выборку всех клиентов, для которых firstName имеет значение Винсент:

>SELECT c

>FROM Customer c

>WHERE c.firstName = 'Винсент'

Вы можете еще больше ограничить результаты запросов, используя логические операторы AND и OR. В приведенном далее примере AND задействуется для выборки всех клиентов, для которых firstName имеет значение Винсент, а country — значение Франция:

>SELECT c

>FROM Customer c

>WHERE c.firstName = 'Винсент' AND c.address.country = 'Франция'

В операторе WHERE также могут применяться операторы сравнения: =, >, >=, <, <=, <>, [NOT] BETWEEN, [NOT] LIKE, [NOT] IN, IS [NOT] NULL, IS [NOT] EMPTY, [NOT] MEMBER [OF]. Далее приведен пример использования двух из этих операторов:

>SELECT c

>FROM Customer c

>WHERE c.age > 18


>SELECT c

>FROM Customer c

>WHERE c.age NOT BETWEEN 40 AND 50


>SELECT c

>FROM Customer c

>WHERE c.address.country IN ('США', 'Португалия')

Выражение LIKE состоит из строки и опциональных знаков переключения кода, которые определяют условия соответствия: знак подчеркивания (_) для метасимволов, состоящих из одного знака, и знак процента (%), если речь идет о метасимволах, состоящих из множества знаков.

>SELECT c

>FROM Customer c

>WHERE c.email LIKE '%mail.com'


Привязка параметров

Операторы WHERE, приводившиеся в этой книге до настоящего момента, задействовали только фиксированные значения. В приложениях запросы часто зависят от параметров. JPQL поддерживает синтаксис для привязки параметров двух типов, делая возможным внесение динамических изменений в ограничительный оператор запроса. Это позиционные и именованные параметры.

Позиционные параметры обозначаются знаком вопроса (?), за которым следует целочисленное значение (например,?1). При выполнении запроса необходимо указать номера параметров, которые нужно заменить.

>SELECT c

>FROM Customer c

>WHERE c.firstName =?1 AND c.address.country =?2

Именованные параметры обозначаются строковым идентификатором с префиксом в виде знака двоеточия (:). При выполнении запроса необходимо указать имена параметров, которые следует заменить.

>SELECT c

>FROM Customer c

>WHERE c.firstName =:fname AND c.address.country =:country

В разделе «Запросы», приведенном далее в этой главе, вы увидите, как приложение осуществляет привязку параметров.


Подзапросы

Подзапрос — это запрос SELECT, который вложен в условное выражение WHERE или HAVING. Результаты подзапроса оцениваются и интерпретируются в условном выражении главного запроса. Для извлечения информации о самых молодых клиентах из базы данных сначала нужно выполнить подзапрос с использованием MIN(age), а затем его результаты будут оценены в главном запросе.

>SELECT c

>FROM Customer c

>WHERE c.age = (SELECT MIN(cust. age) FROM Customer cust))

ORDER BY

Оператор ORDER BY позволяет упорядочивать сущности или значения, возвращаемые в результате выполнения запроса SELECT. Упорядочение применяется для атрибута сущности, который указан в этом предложении и за которым следует ключевое слово ASC или DESC. Ключевое слово ASC определяет, что будет применяться упорядочение по возрастанию; ключевое слово DESC, которое является его противоположностью, определяет, что применяется упорядочение по убыванию. Сортировка по возрастанию задействуется по умолчанию, и ее можно не указывать.

>SELECT c

>FROM Customer c

>WHERE c.age > 18

>ORDER BY c.age DESC

Для уточнения порядка сортировки также можно использовать множественные выражения:

>SELECT c

>FROM Customer c

>WHERE c.age > 18

>ORDER BY c.age DESC, c.address.country ASC

GROUP BY и HAVING

Конструкция GROUP BY делает возможной агрегацию результирующих значений согласно набору свойств. Сущности делятся на группы в зависимости от значений связанных с ними полей, которые указаны в предложении GROUP BY. Чтобы сгруппировать клиентов в соответствии со страной их проживания и сосчитать их, используйте приведенный далее запрос:

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

>FROM Customer c

>GROUP BY c.address.country

GROUP BY определяет выражения группировки (c.address.country), с использованием которых будет осуществляться агрегация и подсчет результатов (count(c)). Следует отметить, что выражения, присутствующие в операторе GROUP BY, также должны быть в операторе SELECT.

Оператор HAVING определяет соответствующий фильтр, который применяется после того, как будут сгруппированы результаты запроса, подобно вторичному оператору WHERE, обеспечивая фильтрацию результатов GROUP BY. Если воспользоваться предыдущим запросом, добавив HAVING, то могут быть возвращены результаты, в случае с которыми country будет иметь значение, отличное от Англия.


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