Какие языки запросов поддерживает Hibernate?

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

Ответ

Hibernate поддерживает несколько способов выполнения запросов:

  • HQL (Hibernate Query Language) — объектно-ориентированный аналог SQL, работающий с сущностями и их свойствами.
  • JPQL (Java Persistence Query Language) — стандартизированная версия HQL, часть спецификации JPA.
  • Нативный SQL — позволяет выполнять прямые SQL-запросы к базе данных.
  • Criteria API — типобезопасный, объектный способ построения запросов.
  • Specification API (через JPA Criteria) — паттерн для удобного построения динамических запросов.

Пример HQL:

Query<Person> query = session.createQuery(
    "FROM Person p WHERE p.age > :age", Person.class
);
query.setParameter("age", 18);
List<Person> results = query.getResultList();

Пример Criteria API:

CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<Person> cq = cb.createQuery(Person.class);
Root<Person> root = cq.from(Person.class);
cq.select(root).where(cb.gt(root.get("age"), 18));
List<Person> results = session.createQuery(cq).getResultList();

Почему это важно: Разные подходы подходят для разных сценариев. HQL/JPQL удобны для статических запросов, Criteria API — для динамических и типобезопасных, а нативный SQL — для сложных, специфичных для СУБД операций.