Назад к вопросам
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();