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