Подобно 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();