Ответ
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.
Ответ 18+ 🔞
А, Named Query в Hibernate, ну это ж классика, блядь! Представь себе, что ты каждый раз не пишешь один и тот же запрос в коде, а даёшь ему имя, как псу кличку, и потом просто кричишь: "Муму, иди сюда, блядь!" — и он прибегает.
По сути, это — заранее заготовленный, проверенный запрос (JPQL, HQL или даже нативный SQL), который ты пристёгиваешь прямо к сущности, как медальон на шею. И потом тыкаешь в него пальцем по имени, когда надо.
А плюсы-то какие, ёпта:
- Проверка сразу, а не потом. Он компилируется и проверяется, когда приложение стартует, а не когда ты уже в прод залил и тебе в лог пиздец прилетел. То есть, если ты в запросе накосячил, ты узнаешь об этом сразу, а не когда тебе пользователь в глаз даст.
- Не повторяешься, как идиот. Не нужно копировать одну и ту же хуйню по десять раз в разных сервисах. Объявил один раз — и юзай, где впадлу.
- Читаемость, мать её.
"Employee.findByName"— это же понятно, блядь! А не"SELECT e FROM Employee e WHERE e.name = :name", который в середине сервиса затеряется, как хуй в стоге сена. - Производительность. Hibernate может план выполнения этого запроса припрятать в кэш, чтобы не пересобирать его каждый раз, как дурак. Быстрее будет, одним словом.
Ну и как это выглядит, на примере:
-
Вешаем запрос на сущность, как табличку:
@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.), чтобы не было потом: "А это чей запросfindAll? Их тут, блядь, овердохуища!" - А если у тебя запрос динамический, там условия пляшут, как угорелые — то это не для Named Query, чувак. Тут уже Criteria API или QueryDSL в руки, и давай, собирай, как конструктор, а то нихуя не угадаешь, что пользователь выкинет.