Ответ
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: Для статических, хорошо известных запросов — они часто более читаемы.