Изучаем Java EE 7 - [92]
Чтобы ограничить результаты, добавьте критерии поиска. Вы можете воспользоваться оператором WHERE, как показано далее:
>SELECT b
>FROM Book b
>WHERE b.title = 'H2G2'
Псевдоним предназначен для навигации по атрибутам сущности с применением оператора-точки. Поскольку сущность Book обладает постоянным атрибутом, носящим имя title и тип String, b.title ссылается на атрибут title сущности Book. Выполнение этого оператора приведет к получению списка, в который будет входить нуль или более экземпляров Book со значением title в виде H2G2.
Самый простой запрос на выборку состоит из двух обязательных частей — операторов SELECT и FROM. SELECT определяет формат результатов запроса. Оператор FROM определяет сущность или сущности, из которых будут получаться результаты, а необязательные операторы WHERE, ORDER BY, GROUP BY и HAVING могут быть использованы для ограничения или упорядочения результатов запроса. Листинг 6.20 демонстрирует упрощенный синтаксис JPQL-оператора.
>SELECT <оператор SELECT>
>FROM <оператор FROM>
>[WHERE <оператор WHERE>]
>[ORDER BY <оператор ORDER BY>]
>[GROUP BY <оператор GROUP BY>]
>[HAVING <оператор HAVING>]
Листинг 6.20 определяет оператор SELECT, а операторы DELETE и UPDATE также могут быть использованы для выполнения операций удаления и обновления в отношении множественных экземпляров заданного класса-сущности.
SELECT
Оператор SELECT придерживается синтаксиса выражений путей и приводит к результату в одной из следующих форм: сущность, атрибут сущности, выражение-конструктор, агрегатная функция или их последовательность. Выражения путей являются строительными блоками запросов и используются для перемещения по атрибутам сущности или связям сущностей (либо коллекции сущностей) с помощью точечной (.) навигации с применением следующего синтаксиса:
>SELECT [DISTINCT] <выражение> [[AS] <идентификационная переменная>]
>expression::= { NEW | TREAT | AVG | MAX | MIN | SUM | COUNT }
Простой оператор SELECT возвращает сущность. Например, если сущность Customer содержит псевдоним c, то SELECT возвратит сущность или список сущностей:
>SELECT c
>FROM Customer c
Однако оператор SELECT также может возвращать атрибуты. Если у Customer имеется firstName, то SELECT c.firstName возвратит строку или коллекцию строк с firstName.
Чтобы извлечь firstName и lastName сущности Customer, вам потребуется сгенерировать список, который будет включать два следующих атрибута:
>SELECT c.firstName, c.lastName
>FROM Customer c
С выходом версии JPA 2.0 появилась возможность извлекать атрибуты в зависимости от условий (с использованием выражения CASE WHEN… THEN… ELSE… END). Например, вместо извлечения значения, говорящего о цене книги, оператор может возвратить расчет цены (например, с 50 %-ной скидкой) в зависимости от издателя (например, с 50 %-ной скидкой на книги от «Apress» и 20 %-ной скидкой на все прочие книги).
>SELECT CASE b.editor WHEN 'Apress'
>·····················THEN b.price * 0.5
>·····················ELSE b.price * 0.8
>·······END
>FROM Book b
Если сущность Customer связана отношением «один к одному» с Address, то c.address будет ссылаться на адрес клиента, а в результате выполнения приведенного далее запроса будет возвращен не список клиентов, а список адресов:
>SELECT c.address
>FROM Customer c
Навигационные выражения можно объединять в цепочку для обхода комплексных EntityGraph. Благодаря этой методике можно создавать выражения путей, например c.address.country.code, ссылающиеся на код страны в адресе клиента:
>SELECT c.address.country.code
>FROM Customer c
В выражении SELECT можно применять конструктор для возврата экземпляра Java-класса, который инициализируется с использованием результата запроса. Класс не обязан быть сущностью, однако конструктор должен быть полностью уточненным и сочетаться с атрибутами.
>SELECT NEW org.agoncal.javaee7.CustomerDTO(c.firstName, c.lastName, c.address.street1)
>FROM Customer c
Результатом этого запроса будет список объектов CustomerDTO, экземпляры которых были созданы с применением оператора new и инициализированы с использованием имен, фамилий и улиц проживания клиентов.
Выполнение показанных далее запросов приведет к возврату одного значения или коллекции, в которую будет входить нуль и более сущностей (или атрибутов), включая дубликаты. Для удаления дубликатов необходимо воспользоваться оператором DISTINCT.
>SELECT DISTINCT c
>FROM Customer c
>SELECT DISTINCT c.firstName
>FROM Customer c
Результатом запроса может оказаться результат выполнения агрегатной функции, примененной в выражении пути. В операторе SELECT могут быть использованы следующие агрегатные функции: AVG, COUNT, MAX, MIN, SUM. Результаты можно сгруппировать оператором GROUP BY и профильтровать оператором HAVING.
>SELECT COUNT(c)
>FROM Customer c
Скалярные выражения тоже могут быть использованы в операторе SELECT запроса, равно как и в операторах WHERE и HAVING. Эти выражения можно применять в отношении числовых (ABS, SQRT, MOD, SIZE, INDEX) и строковых значений (CONCAT, SUBSTRING, TRIM, LOWER, UPPER, LENGTH, LOCATE), а также значений даты/времени (CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP).
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.