Что такое Query в Hibernate?

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

Ответ

Query в Hibernate — это объектное представление запроса к базе данных, позволяющее выполнять операции выборки, обновления или удаления, используя HQL, JPQL, SQL или Criteria API.

Основные типы запросов:

  1. HQL (Hibernate Query Language): Объектно-ориентированный язык, похожий на SQL, но работающий с сущностями и их полями.
    Query<Person> query = session.createQuery(
        "FROM Person p WHERE p.age > :age", Person.class
    );
    query.setParameter("age", 18);
    List<Person> adults = query.getResultList();
  2. JPQL (Java Persistence Query Language): Стандартизированная версия HQL, часть спецификации JPA.
  3. Native SQL: Прямое выполнение SQL-запросов с маппингом результата на сущности.
    SQLQuery<Person> query = session.createSQLQuery(
        "SELECT * FROM person WHERE department_id = :deptId"
    );
    query.addEntity(Person.class);
    query.setParameter("deptId", 5);
    List<Person> results = query.list();
  4. Criteria API: Типобезопасный, программный способ построения запросов.
    CriteriaBuilder cb = session.getCriteriaBuilder();
    CriteriaQuery<Person> cr = cb.createQuery(Person.class);
    Root<Person> root = cr.from(Person.class);
    cr.select(root).where(cb.gt(root.get("age"), 18));
    Query<Person> query = session.createQuery(cr);

Ключевые методы интерфейса Query:

  • setParameter() — безопасная привязка параметров.
  • getResultList() — возвращает список результатов.
  • getSingleResult() — возвращает один результат (бросает исключение, если их нет или много).
  • executeUpdate() — для операций UPDATE/DELETE.
  • setMaxResults(), setFirstResult() — для пагинации.

Зачем использовать? Query абстрагирует SQL, обеспечивает переносимость между СУБД, защищает от SQL-инъекций и интегрируется с системой кэширования Hibernate.