JPA — запрос с критерием. Использование API-интерфейса критериев JPA 2

Создание запроса к базе данных с критерием в JPA. Использование API-интерфейса критериев JPA 2

Используемые технологии
  • Spring 4.1.5.RELEASE
  • Hibernate 5.0.1.Final
  • JPA 2.1
  • MySQL 5.6.25
  • IntelliJ IDEA 14
  • Maven 3.2.5

1. Структура проекта

Настройки взяты из JPA – пример приложения Hello World, используемые здесь сущности взяты в измененной версии JPA – операции INSERT, UPDATE, DELETE.

2. Создание метамодели с использованием JPA-интерфейса критериев

Описание и генерацию метамодели для нашего примера вынес в отдельную статью — Создание метамодели для сущностного класса в JPA 2. Приведу полученный результат:

ContactEntity_:

Как видите в сгенерированной метамодели используется аннотация @StaticMetamodel(ContactEntity.class) с указанием сущностного класса. Обратите внимание, что класс метамодели ContactEntity_.class лежит в том же пакете, что и сущность ContactEntity.class.

ContactHobbyDetailEntity_:

ContactTelDetailEntity_:

HobbyEntity_:

После создания метамодели появляется возможность создания запроса с критерием, который будет проверяться на этапе компиляции, а не во время выполнения, т.к. он строго типизирован.

3. Создание запроса с критерием

Создадим один метод для запроса с критерием JPA 2:

interface ContactService:

Реализация ContactServiceImpl:

Рассмотрим код подробнее.

  • Создаем экземпляр CriteriaBuilder с помощью вызова EntityManager.getCriteriaBuilder()
  • Создаем типизированный запрос с помощью билдера, передавая параметром результирующий тип. Используется CriteriaQuery из пакета javax.persistence.
  • Формируем основу для путевых выражений внутри запроса. Для этого вызывается CriteriaQuery.from() с передачей сущностного класса в качестве параметра. Результатом станет объект корня запроса Root<ContactEntity>.
  • Root.fetch() обеспечивает незамедлительную выборку (по умолчанию в Hibernate (поставщик постоянства для JPA) — отложенная выборка). JoinType.LEFT — задает внешнее соединение. *Если вы читали предыдущие статьи, то выражение эквивалентно left join fetch в JPQL.
  • Далее вызов CriteriaQuery.select() вместе с параметром корня запроса и методом distinct(true). Последний метод устранит дублированные записи.
  • Экземпляр Predicate — ограничение, которое указывает критерий выборки, определенный выражением. Может быть простым или сложным. Получаем с помощью вызова CriteriaBuilder.conjuction().
  • equal() — ожидаемо означает равенство. Внутри него вызывается Root.get() в котором передается атрибут метамодели сущностного класса, к которому будет применяться ограничение. CriteriaBuilder.and() объединяет предикат с существующим предикатом из переменной criteria.
  • Полученный предикат со всеми ограничениями передается запросу с помощью CriteriaQuery.where().
  • Создаем и вызываем запрос.

4. Тестирование запроса с критерием

Простенький метод для вызова запроса с критерием:

Вывод:

ContactEntity{id=3, Name0′, LastName0′, 2015-07-08, 0}
ContactTelDetailEntity{version=0, telNumber=’555-44-33′, telType=’Рабочий’, id=3}
ContactTelDetailEntity{version=0, telNumber=’8-800-200-600′, telType=’Домашний’, id=1}

Исходные коды

JPA insert delete SQL — база данных использованная в цикле статей

JPA Tutorial — criteria — src

Share Button
5
16368 Total Views 1 Views Today

Добавить комментарий