Вопрос проверяет понимание динамических запросов в JPA и умение работать с типобезопасными API вместо строкового SQL.
Criteria API используется для построения динамических запросов к базе данных. Запросы собираются программно, а не строками. Это снижает риск ошибок в именах полей и упрощает рефакторинг. Criteria API особенно полезен, когда условия запроса заранее неизвестны. Однако код получается более многословным, чем JPQL.
Criteria API решает задачу построения сложных и динамических запросов в JPA, когда невозможно заранее написать фиксированный JPQL.
Criteria API — это типобезопасный программный API для построения запросов JPA, в котором запрос формируется через Java-объекты и методы, а не через строки.
Часто фильтры зависят от пользовательского ввода или набора параметров.
Типичный сценарий
пользователь указал часть фильтров
остальные фильтры отсутствуют
запрос нужно собрать на лету
Преимущество
нет сложной конкатенации строк
проще добавлять или убирать условия
Criteria API работает с метамоделью сущностей.
Что это даёт
ошибки в именах полей ловятся на этапе компиляции
рефакторинг не ломает запросы
Контраст с JPQL
JPQL — строки
ошибки видны только в рантайме
Criteria API часто используется через Specification.
Это позволяет
комбинировать условия
переиспользовать части запросов
писать чистый и расширяемый код
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<User> query = cb.createQuery(User.class);
Root<User> root = query.from(User.class);
List<Predicate> predicates = new ArrayList<>();
// условия добавляются динамически
predicates.add(cb.equal(root.get("status"), "ACTIVE"));
query.where(predicates.toArray(new Predicate[0]));
Код более многословный
Сложнее читать, чем JPQL
Не всегда оправдан для простых запросов
Criteria API стоит применять для сложных и динамических запросов, особенно когда важна типобезопасность и переиспользуемость условий.