Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Примеры запросов

Следующие запросы выполняются к сущности Player приложения roster, которая описана в приложении roster.

Здесь рассматриваются следующие темы:

Простые запросы

Если вы не знакомы с языком запросов, эти простые запросы станут хорошей отправной точкой.

Здесь рассматриваются следующие темы:

Основной запрос на выборку данных

SELECT p
FROM Player p
  • Полученные данные: все игроки.

  • Описание: предложение FROM объявляет переменную p, опуская необязательное ключевое слово AS. Если бы было включено ключевое слово AS, предложение было бы записано следующим образом:

    FROM Player AS p

    Элемент Player в схеме абстракций соответствует сущности Player.

  • Смотрите также: Идентификационные переменные.

Устранение повторяющихся значений

SELECT DISTINCT p
FROM Player p
WHERE p.position = ?1
  • Полученные данные: игроки с позицией, указанной параметром запроса.

  • Описание: ключевое слово DISTINCT удаляет повторяющиеся значения.

    Предложение WHERE фильтрует игроков путём проверки их position, персистентного поля сущности Player. Элемент ?1 обозначает входной параметр запроса.

  • Смотрите также: Входные параметры и Ключевое слово DISTINCT.

Использование именованных параметров

SELECT DISTINCT p
FROM Player p
WHERE p.position = :position AND p.name = :name
  • Полученные данные: игроки с указанными позицией и именем.

  • Описание: элементы position и name являются персистентными полями сущности Player. Предложение WHERE сравнивает значения этих полей с именованными параметрами запроса, установленными с помощью метода Query.setNamedParameter. Язык запросов обозначает именованный входной параметр, используя двоеточие (:), за которым следует идентификатор. Первый входной параметр — :position, второй — :name.

На языке запросов выражение может перемещаться по связанным объектам. Эти выражения являются основным отличием языка запросов персистентности Java от SQL. Запросы перемещают к связанным объектам, тогда как SQL объединяет таблицы.

Здесь рассматриваются следующие темы:

Простой запрос с отношениями

SELECT DISTINCT p
FROM Player p, IN (p.teams) t
  • Полученные данные: все игроки, играющие за команду (неважно какую).

  • Описание: предложение FROM объявляет две переменные: p и t. Переменная p представляет сущность Player, а переменная t представляет связанную сущность Team. Объявление для t ссылается на ранее объявленную переменную p. Ключевое слово IN означает, что teams является набором связанных сущностей. Выражение p.teams перемещается от Player к связанной с ним Team. Точка в выражении p.teams является оператором навигации.

    Тот же запрос может быть написан с использованием оператора JOIN:

    SELECT DISTINCT p
    FROM Player p JOIN p.teams t

    Или так:

    SELECT DISTINCT p
    FROM Player p
    WHERE p.team IS NOT EMPTY

Переход к однозначным полям отношений

Используйте оператор предложения JOIN, чтобы перейти к однозначному полю отношений:

SELECT t
FROM Team t JOIN t.league l
WHERE l.sport ='football'

В этом примере запрос вернёт все команды из футбольной лиги.

Обход отношений с входным параметром

SELECT DISTINCT p
FROM Player p, IN (p.teams) AS t
WHERE t.city = :city
  • Полученные данные: игроки, команды которых находятся в указанном городе.

  • Описание: этот запрос похож на предыдущий пример, но добавляет входной параметр. Ключевое слово AS в предложении FROM является необязательным. В предложении WHERE точка, предшествующая персистентной переменной city, является разделителем, а не оператором навигации. Строго говоря, выражения могут перемещаться к полям отношений (связанным объектам), но не к персистентным полям. Чтобы получить доступ к персистентному полю, выражение использует точку в качестве разделителя.

    Выражения не могут выходить за пределы (или уточнять) полей отношений, которые являются коллекциями. В синтаксисе выражения поле со значением коллекции является терминальным символом. Поскольку поле teams является коллекцией, предложение WHERE не может указывать p.teams.city (недопустимое выражение).

  • Смотрите также: Выражения пути.

Обход множественных отношений

SELECT DISTINCT p
FROM Player p, IN (p.teams) t
WHERE t.league = :league
  • Полученные данные: игроки указанной лиги.

  • Описание: выражения в этом запросе перемещаются по двум отношениям. Выражение p.teams перемещается по отношению Player-Team, а выражение t.league перемещается по отношению Team-League.

В других примерах входными параметрами являются объекты String. В этом примере параметр является объектом типа League. Этот тип соответствует полю отношения league в выражении сравнения предложения WHERE.

SELECT DISTINCT p
FROM Player p, IN (p.teams) t
WHERE t.league.sport = :sport
  • Полученные данные: игроки, участвующие в указанном виде спорта.

  • Описание: персистентное поле sport принадлежит сущности League. Чтобы добраться до поля sport, запрос должен сначала перейти от сущности Player к Team (p.teams) а затем из Team в организацию League (t.league). Поскольку это не коллекция, за полем отношений league может следовать персистентное поле sport.

Запросы с другими условными выражениями

Каждое предложение WHERE должно указывать условное выражение одного из нескольких видов. В предыдущих примерах условные выражения — это выражения сравнения, которые проверяют равенство. Следующие примеры демонстрируют и другие виды условных выражений. Для описания всех условных выражений см. Выражение WHERE.

Здесь рассматриваются следующие темы:

Выражение LIKE

SELECT p
FROM Player p
WHERE p.name LIKE 'Mich%'
  • Полученные данные: все игроки, чьи имена начинаются с "Mich".

  • Описание: выражение LIKE использует символы подстановки для выборки строк, соответствующих шаблону подстановки. В этом случае запрос использует выражение LIKE и подстановочный знак %, чтобы найти всех игроков, имена которых начинаются со строки «Mich». Например, «Michael» и «Michelle» оба соответствуют шаблону подстановочных знаков.

  • Смотрите также: Выражения LIKE.

Выражение IS NULL

SELECT t
FROM Team t
WHERE t.league IS NULL
  • Полученные данные: все команды, не связанные ни с одной лигой.

  • Описание: выражение IS NULL можно использовать для проверки, установлена ​​ли связь между двумя сущностями. В этом случае запрос проверяет, связаны ли команды с какой-либо лигой, и возвращает команды, которые не имеют лигу.

  • Смотрите также: выражения сравнения NULL и значения NULL.

Выражение IS EMPTY

SELECT p
FROM Player p
WHERE p.teams IS EMPTY
  • Полученные данные: все игроки без команды.

  • Описание: поле отношения teams объекта Player является коллекцией. Если игрок не принадлежит ни к одной команде, коллекция teams пуста, а условное выражение равно TRUE.

  • Смотрите также: Выражения сравнения с пустой коллекцией.

Выражение BETWEEN

SELECT DISTINCT p
FROM Player p
WHERE p.salary BETWEEN :lowerSalary AND :higherSalary
  • Полученные данные: игроки, зарплаты которых находятся в указанном диапазоне.

  • Описание: BETWEEN имеет три арифметических выражения: персистентное поле (p.salary) и два входных параметра (:lowerSalary и :higherSalary). Следующее выражение эквивалентно выражению BETWEEN:

    p.salary >= :lowerSalary AND p.salary <= :higherSalary
  • Смотрите также: Выражения BETWEEN.

Операторы сравнения

SELECT DISTINCT p1
FROM Player p1, Player p2
WHERE p1.salary > p2.salary AND p2.name = :name
  • Полученные данные: все игроки, чья зарплата выше зарплаты игрока с указанным именем.

  • Описание: предложение FROM объявляет две переменные (p1 и p2) типа Player. Две переменные необходимы, потому что предложение WHERE сравнивает зарплату одного игрока (p2) с зарплатой других игроков (p1).

  • Смотрите также: Идентификационные переменные.

Массовые обновления и удаления

В следующих примерах показано, как использовать выражения UPDATE и DELETE в запросах. UPDATE и DELETE работают с несколькими объектами в соответствии с условием/условиями, установленными в предложении WHERE. Предложение WHERE в запросах UPDATE и DELETE соответствует тем же правилам, что и запросы SELECT.

Здесь рассматриваются следующие темы:

Запросы на обновление данных

UPDATE Player p
SET p.status = 'inactive'
WHERE p.lastPlayed < :inactiveThresholdDate
  • Описание: этот запрос устанавливает статус группы игроков в inactive, если последняя игра игрока была раньше даты, указанной в inactiveThresholdDate.

Запросы удаления данных

DELETE
FROM Player p
WHERE p.status = 'inactive'
AND p.teams IS EMPTY
  • Описание: Этот запрос удаляет всех неактивных игроков без команды.


Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)