Часто разработчикам нравится разбрасывать строковые литералы HQL по всему Java-коду, этот метод трудно поддерживать и выглядит некрасиво. К счастью, в Hibernate появилась технология под названием ” запросы имен “, она позволяет разработчику помещать все HQL в файл сопоставления XML или с помощью аннотации.
Как объявить именованный запрос
Именованный запрос поддерживается как в HQL, так и в собственном SQL. смотрите примеры…
1. Файл сопоставления XML
HQL в файле сопоставления
...
Собственный SQL в файле сопоставления
...
Вы можете поместить именованный запрос внутри элемента ” hibernate-сопоставление “, но не ставьте его перед элементом ” класс “, Hibernate запросит недопустимый файл сопоставления, все ваши именованные запросы должны быть помещены после элемента ” класс “.
2. Аннотация
HQL в аннотации
@NamedQueries({ @NamedQuery( name = "findStockByStockCode", query = "from Stock s where s.stockCode = :stockCode" ) }) @Entity @Table(name = "stock", catalog = "mkyong") public class Stock implements java.io.Serializable { ...
Собственный SQL в аннотации
@NamedNativeQueries({ @NamedNativeQuery( name = "findStockByStockCodeNativeSQL", query = "select * from stock s where s.stock_code = :stockCode", resultClass = Stock.class ) }) @Entity @Table(name = "stock", catalog = "mkyong") public class Stock implements java.io.Serializable { ...
В родном SQL вы должны объявить ” класс результата “, чтобы сообщить Hibernate, какой тип возвращаемого значения, если этого не сделать, возникнет исключение” org.hibernate.cfg. Исключение NotYetImplementedException: Чистые собственные скалярные запросы пока не поддерживаются “.
Вызов именованного запроса
В режиме гибернации вы можете вызвать именованный запрос через getNamedQuery метод.
Query query = session.getNamedQuery("findStockByStockCode") .setString("stockCode", "7277");
Query query = session.getNamedQuery("findStockByStockCodeNativeSQL") .setString("stockCode", "7277");
Вывод
Именованные запросы имеют глобальный доступ, что означает, что имя запроса должно быть уникальным в файлах сопоставления XML или аннотациях. В реальной среде всегда рекомендуется изолировать все именованные запросы в их собственный файл. Кроме того, именованные запросы, хранящиеся в файлах отображения гибернации или аннотациях, легче поддерживать, чем запросы, разбросанные по коду Java.
Оригинал: “https://mkyong.com/hibernate/hibernate-named-query-examples/”