Ответ
Named Query (именованный запрос) в Hibernate — это предопределенный JPQL/HQL или нативный SQL запрос, который объявляется на уровне сущности (через аннотации или XML) и может быть многократно использован по его имени.
Основные преимущества:
- Ранняя проверка: Запрос компилируется и проверяется на корректность при старте приложения, а не во время выполнения, что позволяет сразу обнаружить синтаксические ошибки.
- Повторное использование: Устраняет дублирование строк запросов в коде.
- Улучшенная читаемость: Имя запроса (
findEmployeeByName) лучше описывает его назначение, чем строка JPQL/HQL. - Производительность: Hibernate может кэшировать план выполнения именованных запросов.
Пример объявления и использования:
-
Объявление с помощью аннотации
@NamedQuery:@Entity @NamedQuery( name = "Employee.findByName", query = "SELECT e FROM Employee e WHERE e.name = :empName" ) public class Employee { // ... поля сущности } -
Использование в коде:
// Через EntityManager (JPA) TypedQuery<Employee> query = entityManager.createNamedQuery("Employee.findByName", Employee.class); query.setParameter("empName", "John"); List<Employee> results = query.getResultList();
Лучшие практики:
- Используйте для сложных, статических и часто используемых запросов.
- Давайте осмысленные имена, часто с префиксом имени сущности (например,
Employee.). - Для динамических запросов (где условия меняются) лучше использовать Criteria API или QueryDSL.