Примеры именованных запросов Hibernate
Часто разработчикам нравится размещать строковые литералы HQL по всему Java-коду, этот метод трудно поддерживать и выглядит уродливо. К счастью, в Hibernate появилась технология под названием «names queries», которая позволяет разработчику помещать весь HQL в файл сопоставления XML или с помощью аннотации.
Как объявить именованный запрос
Именованный запрос поддерживается как в HQL, так и в собственном SQL. смотрите примеры ...
1. XML-файл отображения
HQL в файле отображения
...
Собственный SQL в файле отображения
...
Вы можете разместить именованный запрос внутри элемента 'hibernate-mapping', но не помещайте его перед элементом 'class', Hibernate выдаст запрос неверного файла сопоставления, все ваши именованные запросы должны быть помещены после 'class 'элемент.
Note
Что касается CDATA, всегда рекомендуется заключать текст запроса в CDATA, чтобы синтаксический анализатор XML не вызывал ошибку для некоторых специальных символов XML, таких как ‘>’, <‘и т. д.
2. аннотирование
HQL в аннотации
@NamedQueries({ @NamedQuery( name = "findStockByStockCode", query = "from Stock s where s.stockCode = :stockCode" ) }) @Entity @Table(name = "stock", catalog = "example") 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 = "example") public class Stock implements java.io.Serializable { ...
В собственном SQL вы должны объявить «resultClass», чтобы Hibernate узнал, какой тип возвращаемого значения, если это не сделать, вызовет исключение «org.hibernate.cfg.NotYetImplementedException: Pure native scalar queries are not yet supported».
Вызов именованного запроса
В Hibernate вы можете вызвать именованный запрос с помощью методаgetNamedQuery.
Query query = session.getNamedQuery("findStockByStockCode") .setString("stockCode", "7277");
Query query = session.getNamedQuery("findStockByStockCodeNativeSQL") .setString("stockCode", "7277");
Заключение
Именованные запросы имеют глобальный доступ, что означает, что имя запроса должно быть уникальным в файлах отображения XML или аннотациях. В реальной среде всегда полезно изолировать все именованные запросы в отдельный файл. Кроме того, именованные запросы, хранящиеся в файлах отображения или аннотации Hibernate, проще обслуживать, чем запросы, разбросанные по коду Java.