Назад к вопросам
Middle
68
questionbank

Что такое именованный запрос (Named Query) в Hibernate?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Именованный запрос в Hibernate — это предопределенный SQL или HQL запрос, который ассоциируется с уникальным именем. Он определяется с использованием аннотации @NamedQuery или в файле orm.xml. Это позволяет управлять запросами в одном месте, улучшая читаемость и удобство поддержки кода.

Преимущества:

  • Читаемость: Запросы сосредоточены в одном месте, что делает код более понятным.
  • Переиспользование: Запрос можно вызвать по имени из разных частей приложения.
  • Проверка на старте: Hibernate проверяет синтаксис HQL/JPQL именованных запросов при загрузке контекста, что позволяет выявить ошибки до выполнения.
  • Удобство рефакторинга: При изменении запроса достаточно отредактировать его в одном месте.

Пример с аннотацией @NamedQuery:

// в классе сущности PersistedClass

@Entity
@NamedQuery(name = "findAllPersistedClasses", query = "SELECT p FROM PersistedClass p")
public class PersistedClass {
    @Id
    private Long id;
    private String name;

    // getters and setters
}
// использование в коде

Session session = sessionFactory.openSession();
Query query = session.createNamedQuery("findAllPersistedClasses", PersistedClass.class);
List<PersistedClass> resultList = query.getResultList();
session.close();

Пример с файлом META-INF/orm.xml:

<!-- orm.xml -->

<entity-mappings
        xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence/orm http://xmlns.jcp.org/xml/ns/persistence/orm_2_2.xsd"
        version="2.2">
    <named-query name="findAllPersistedClassesXml">
        <query>SELECT p FROM PersistedClass p</query>
    </named-query>
</entity-mappings>
// использование в коде

Session session = sessionFactory.openSession();
Query query = session.createNamedQuery("findAllPersistedClassesXml", PersistedClass.class);
List<PersistedClass> resultList = query.getResultList();
session.close();