Ответ
Да, использовал JPA Criteria API для построения динамических типобезопасных запросов.
Преимущества и применение:
- Типобезопасность: Ошибки обнаруживаются на этапе компиляции, а не во время выполнения (в отличие от строкового JPQL).
- Динамические запросы: Идеально подходит для конструкторов запросов с изменяющимся набором условий (например, в фильтрах поиска).
- Гибкость: Позволяет программно создавать сложные запросы с join, группировками и агрегатными функциями.
Пример: динамический поиск пользователей
public List<User> findUsers(String nameFilter, Integer minAge) {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<User> query = cb.createQuery(User.class);
Root<User> user = query.from(User.class);
List<Predicate> predicates = new ArrayList<>();
if (nameFilter != null && !nameFilter.isEmpty()) {
predicates.add(cb.like(cb.lower(user.get("name")), "%" + nameFilter.toLowerCase() + "%"));
}
if (minAge != null) {
predicates.add(cb.ge(user.get("age"), minAge));
}
query.where(cb.and(predicates.toArray(new Predicate[0])));
query.orderBy(cb.asc(user.get("name")));
return entityManager.createQuery(query).getResultList();
}
Сравнение с JPQL:
- Criteria API: Лучше для динамических запросов, безопаснее типов.
- JPQL: Лаконичнее и читабельнее для статических, известных заранее запросов.
Часто использовал в связке с JPA Metamodel для абсолютной типобезопасности при обращении к атрибутам сущности (например, User_.name).