SELECT p
FROM Player p
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.
Здесь рассматриваются следующие темы:
SELECT p
FROM Player p
WHERE p.name LIKE 'Mich%'
Полученные данные: все игроки, чьи имена начинаются с "Mich".
Описание: выражение LIKE
использует символы подстановки для выборки строк, соответствующих шаблону подстановки. В этом случае запрос использует выражение LIKE
и подстановочный знак %
, чтобы найти всех игроков, имена которых начинаются со строки «Mich». Например, «Michael» и «Michelle» оба соответствуют шаблону подстановочных знаков.
Смотрите также: Выражения LIKE.
SELECT t
FROM Team t
WHERE t.league IS NULL
Полученные данные: все команды, не связанные ни с одной лигой.
Описание: выражение IS NULL
можно использовать для проверки, установлена ли связь между двумя сущностями. В этом случае запрос проверяет, связаны ли команды с какой-либо лигой, и возвращает команды, которые не имеют лигу.
Смотрите также: выражения сравнения NULL и значения NULL.
SELECT p
FROM Player p
WHERE p.teams IS EMPTY
Полученные данные: все игроки без команды.
Описание: поле отношения teams
объекта Player
является коллекцией. Если игрок не принадлежит ни к одной команде, коллекция teams
пуста, а условное выражение равно TRUE
.
Смотрите также: Выражения сравнения с пустой коллекцией.
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
Описание: Этот запрос удаляет всех неактивных игроков без команды.
Назад | Вперёд | Содержание |