Что такое Criteria API в JPA/Hibernate?

«Что такое Criteria API в JPA/Hibernate?» — вопрос из категории Hibernate, который задают на 22% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Criteria API — это программный, типобезопасный способ построения динамических запросов к базе данных в JPA (начиная с JPA 2.0). Это объектно-ориентированная альтернатива написанию строковых JPQL- или SQL-запросов.

Основные преимущества:

  • Типобезопасность и проверка на этапе компиляции: Ошибки в именах полей или типах данных обнаруживаются компилятором, а не в runtime.
  • Динамическое построение запросов: Идеально для сложных фильтров, где условия формируются в процессе выполнения программы.
  • Удобство рефакторинга: IDE могут отслеживать ссылки на поля сущностей.

Базовый пример запроса:

// 1. Получить CriteriaBuilder от EntityManager
CriteriaBuilder cb = entityManager.getCriteriaBuilder();

// 2. Создать типизированный CriteriaQuery
CriteriaQuery<Employee> query = cb.createQuery(Employee.class);

// 3. Определить корневой тип (FROM)
Root<Employee> employee = query.from(Employee.class);

// 4. Построить запрос (SELECT ... WHERE ... ORDER BY)
query.select(employee)
     .where(cb.greaterThan(employee.get("salary"), 100000)) // Условие
     .orderBy(cb.desc(employee.get("lastName"))); // Сортировка

// 5. Выполнить
List<Employee> results = entityManager.createQuery(query).getResultList();

Использование метамодели (JPA 2.2+) для абсолютной типобезопасности:

// Предполагается наличие сгенерированного класса Employee_
.where(cb.gt(employee.get(Employee_.salary), 100000))

Когда использовать:

  • Criteria API: Для сложных, динамических запросов (например, в конструкторе отчётов или фильтров).
  • JPQL / Named Queries: Для статических, хорошо известных запросов — они часто более читаемы.