Что такое именованный запрос?
Hibernate позволяет определять операторы запроса в виде строк в файле сопоставления. Этот метод запроса называется именованным запросом.
Каковы преимущества использования именованных запросов?
Поскольку использование HQL Hibernate часто требует написания операторов строкового запроса в коде Java, HQL смешивается между кодами, что ухудшает читаемость кода. Используя именованные запросы, вы можете разделить бизнес-логику и операторы запроса, позволяя сосредоточиться на запросах. Это позволяет избежать ситуации, когда использование HQL Hibernate часто требует написания операторов строкового запроса в коде Java. Код SQL или HQL разбросан по всему приложению.
Именованные запросы можно использовать для обработки сложных запросов.
Как реализовать именованный запрос?
Представляем следующие методы:
Способ 1. Объявите оператор запроса под тегом <class/> в файле конфигурации.
Скопируйте код кода следующим образом:
<гибернация-отображение>
<class name="com.test.bean.Student" table="student"catalog="users">
<id name="id" type="integer">
<имя столбца="id" />
<генератор />
</id>
<имя свойства="имя" тип="строка">
<column name="name" length="11" />
</свойство>
<имя свойства="возраст" тип="целое число">
<column name="возраст" />
</свойство>
<property name="sex" type="string">
<column name="sex" length="2" />
</свойство>
</класс>
<!-- Определить оператор запроса-->
<query name="findStudentByName">
<![CDATA[от Студента, где имя =:имя]]>
</запрос>
</hibernate-маппинг>
Примечание . Что означает <![CDATA[ ]]>?
Указывает, что это простой текст. Без этого символы < > & не могут быть непосредственно сохранены в XML, и их необходимо экранировать. Однако с помощью этого тега эти символы можно хранить в документах XML без экранирования. Это позволит избежать неожиданных специальных символов, вызывающих ошибки синтаксического анализа XML.
Скопируйте код кода следующим образом:
публичный запрос списка <Студент> () {
Сеанс сеанса = HibernateSessionFactory.getSession();
Запрос q = session.getNamedQuery("findStudentByName");
q.setString("имя", "Чжансан");
List<Студент> list = q.list();
список возврата;
}
Способ 2. Вы также можете объявить оператор запроса в теге <class/> в файле конфигурации, но вам необходимо указать его при вызове кода Java (пакет + класс + имя конфигурации).
Скопируйте код кода следующим образом:
<гибернация-отображение>
<class name="com.test.bean.Student" table="student"catalog="users">
<id name="id" type="integer">
<имя столбца="id" />
<генератор />
</id>
<имя свойства="имя" тип="строка">
<column name="name" length="11" />
</свойство>
<имя свойства="возраст" тип="целое число">
<column name="возраст" />
</свойство>
<property name="sex" type="string">
<column name="sex" length="2" />
</свойство>
<!-- Определить оператор запроса-->
<query name="findStudentByName">
<![CDATA[от Студента, где имя =:имя]]>
</запрос>
</класс>
</hibernate-маппинг>
публичный запрос списка <Студент> () {
Сеанс сеанса = HibernateSessionFactory.getSession();
Запрос q = session.getNamedQuery("com.test.bean.Student.findStudentByName");
q.setString("имя", "Чжансан");
List<Студент> list = q.list();
список возврата;
}
Способ третий : использовать собственный SQL-запрос <sql-query>. В этом методе необходимо записать все столбцы таблицы, иначе возникнет ошибка «недопустимое имя столбца», если вы не используете возвращаемый скаляр для установки типа поля.
Скопируйте код кода следующим образом:
<гибернация-отображение>
<class name="com.test.bean.Student" table="student"catalog="users">
<id name="id" type="integer">
<имя столбца="id" />
<генератор />
</id>
<имя свойства="имя" тип="строка">
<column name="name" length="11" />
</свойство>
<имя свойства="возраст" тип="целое число">
<column name="возраст" />
</свойство>
<property name="sex" type="string">
<column name="sex" length="2" />
</свойство>
</класс>
<!-- Определить оператор запроса-->
<sql-query name="findStudentByName">
<возвратный псевдоним="s">
</return>
<![CDATA[выберите {s.*} из учеников, где s.name = :name]]>
</sql-запрос>
</hibernate-маппинг>
Примечание . Вы также можете использовать тег <return-property/> внутри тега <return/> для вывода списка всех полей таблицы. Как и в методе, описанном выше, запрашиваются все столбцы.
Скопируйте код кода следующим образом:
публичный запрос списка <Студент> () {
Сеанс сеанса = HibernateSessionFactory.getSession();
Запрос q = session.getNamedQuery("findStudentByName");
q.setString("имя", "Чжансан");
List<Студент> list = q.list();
список возврата;
}
Способ 4. Используйте собственный SQL-запрос <sql-query>. Если вы используете возвращаемый скаляр для установки типа поля, вы можете запросить некоторые поля.
Скопируйте код кода следующим образом:
<гибернация-отображение>
<class name="com.test.bean.Student" table="student"catalog="users">
<id name="id" type="integer">
<имя столбца="id" />
<генератор />
</id>
<имя свойства="имя" тип="строка">
<column name="name" length="11" />
</свойство>
<имя свойства="возраст" тип="целое число">
<column name="возраст" />
</свойство>
<property name="sex" type="string">
<column name="sex" length="2" />
</свойство>
</класс>
<!-- Определить оператор запроса-->
<sql-query name="findStudentByName">
<return-scalar columns="name" type="string"/>
<return-scalar columns="age" type="integer"/>
<![CDATA[выберите s.name, s.age из учеников, где s.name = :name]]>
</sql-запрос>
</hibernate-маппинг>
публичный список<Object[]> query(){
Сеанс сеанса = HibernateSessionFactory.getSession();
Запрос запроса = session.getNamedQuery("findStudentByName");
query.setString("имя", "чжансан");
List<Object[]> list = query.list();
список возврата;
}
или :
Скопируйте код кода следующим образом:
публичный запрос списка <Студент> () {
Сеанс сеанса = HibernateSessionFactory.getSession();
Запрос q = session.getNamedQuery("findStudentByName").
setResultTransformer(Transformers.aliasToBean(Student.class));
q.setString("имя", "Чжансан");
List<Студент> list = q.list();
список возврата;
}