Какой у вас опыт работы с JPA Criteria API?

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

Ответ

Да, использовал 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).