Подобно JPQL, Criteria API основан на схеме абстракций персистентных сущностей, их отношений и встроенных объектов. Criteria API работает с этой схемой абстракций, чтобы позволить разработчикам выборку, изменение и удаление персистентных объектов, вызывая операции сущностей Java Persistence API. Metamodel API работает совместно с Criteria API для моделирования персистентных классов сущностей для запросов Criteria.
Criteria API и JPQL тесно связаны и предназначены для обеспечения аналогичных операций в их запросах. Разработчики, знакомые с синтаксисом JPQL, найдут схожие операции уровня объектов в Criteria API.
Следующий простой запрос Criteria возвращает все объекты сущности Pet
в базе данных:
EntityManager em = ...;
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);
Root<Pet> pet = cq.from(Pet.class);
cq.select(pet);
TypedQuery<Pet> q = em.createQuery(cq);
List<Pet> allPets = q.getResultList();
Эквивалентный запрос JPQL
Этот запрос демонстрирует основные шаги для создания запроса Criteria.
-
Используйте объект EntityManager
для создания объекта CriteriaBuilder
.
-
Создайте объект запроса, создав объект интерфейса CriteriaQuery
. Атрибуты этого объекта будут содержать детали запроса.
-
Установите корень запроса, вызвав метод from
объекта CriteriaQuery
.
-
Укажите тип результата запроса, вызвав метод select
объекта CriteriaQuery
.
-
Подготовьте запрос к выполнению, создав объект TypedQuery<T>
и указав тип результата запроса.
-
Выполните запрос, вызвав метод getResultList
объекта TypedQuery<T>
. Поскольку этот запрос возвращает коллекцию сущностей, результат сохраняется в List
.
В этой главе подробно обсуждаются все задачи каждого из шагов.
Чтобы создать объект CriteriaBuilder
, вызовите метод getCriteriaBuilder
объекта EntityManager
:
CriteriaBuilder cb = em.getCriteriaBuilder();
Используйте объект CriteriaBuilder
для создания объекта запроса:
CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);
Запрос вернёт объекты сущности Pet
. Чтобы создать типобезопасный запрос, укажите тип запроса при создании объекта CriteriaQuery
.
Вызовите метод from
объекта запроса, чтобы задать условие FROM
запроса и указать корень запроса:
Root<Pet> pet = cq.from(Pet.class);
Вызовите метод select
объекта запроса, передав его в корень запроса, чтобы задать предложение SELECT
запроса:
Теперь используйте объект запроса, чтобы создать объект TypedQuery<T>
, который может быть выполнен для источника данных. Изменения объекта запроса фиксируются для создания готового к выполнению запроса:
TypedQuery<Pet> q = em.createQuery(cq);
Выполните этот типизированный объект запроса, вызвав его метод getResultList
, поскольку этот запрос будет возвращать несколько объектов сущности. Следующий оператор сохраняет результаты в объекте коллекции List<Pet>
:
List<Pet> allPets = q.getResultList();