Hibernate命名查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate命名查询相关的知识,希望对你有一定的参考价值。

什么是命名查询?
Hibernate允许在映射文件中定义字符串形式的查询语句,这种查询方式成为命名查询
使用命名查询有什么好处?
由于使用Hibernate的HQL常常需要在Java代码中写字符串查询语句,HQL混杂在代码之间,破坏代码可读性,通过使用命名查询,可以使业务逻辑和查询语句分离,使您专注于查询,而避免了 SQL 或者 HQL 代码分散于整个应用程序中的情况。
可以应用命名查询做复杂查询的处理

命名查询如何实现?
介绍下面几种方式:
方法一:在配置文件中<class/>标记的下面,声明查询语句

代码如下:

 1 <hibernate-mapping> 
 2 <class name="com.test.bean.Student" table="student" catalog="users"> 
 3 <id name="id" type="integer"> 
 4 <column name="id" /> 
 5 <generator class="identity" /> 
 6 </id> 
 7 <property name="name" type="string"> 
 8 <column name="name" length="11" /> 
 9 </property> 
10 <property name="age" type="integer"> 
11 <column name="age" /> 
12 </property> 
13 <property name="sex" type="string"> 
14 <column name="sex" length="2" /> 
15 </property> 
16 </class> 
17 <!-- 定义查询语句 --> 
18 <query name="findStudentByName"> 
19 <![CDATA[from Student where name = :name]]> 
20 </query> 
21 </hibernate-mapping> 

备注:<![CDATA[ ]]>是什么意思?
标明是纯文本的,没有这个的话 < > & 字符是不能直接存入XML的,需要转义,而用这个标记则不需要转义而将这些符号存入XML文档。可以避免未预料的特殊符号导致XML解析出错。

代码如下:

1 1 public List<Student> query(){ 
2 2 Session session = HibernateSessionFactory.getSession(); 
3 3 Query q = session.getNamedQuery("findStudentByName"); 
4 4 q.setString("name", "zhangsan"); 
5 5 List<Student> list = q.list(); 
6 6 return list; 
7 7 } 

方法二:也可以在配置文件中<class/>标记的里面,声明查询语句, 但是java代码调用时需要指定(包+类+配置名)

代码如下:

 1 <hibernate-mapping> 
 2 <class name="com.test.bean.Student" table="student" catalog="users"> 
 3 <id name="id" type="integer"> 
 4 <column name="id" /> 
 5 <generator class="identity" /> 
 6 </id> 
 7 <property name="name" type="string"> 
 8 <column name="name" length="11" /> 
 9 </property> 
10 <property name="age" type="integer"> 
11 <column name="age" /> 
12 </property> 
13 <property name="sex" type="string"> 
14 <column name="sex" length="2" /> 
15 </property> 
16 <!-- 定义查询语句 --> 
17 <query name="findStudentByName"> 
18 <![CDATA[from Student where name = :name]]> 
19 </query> 
20 </class> 
21 </hibernate-mapping> 
1 public List<Student> query(){ 
2 23 Session session = HibernateSessionFactory.getSession(); 
3 24 Query q = session.getNamedQuery("com.test.bean.Student.findStudentByName"); 
4 25 q.setString("name", "zhangsan"); 
5 26 List<Student> list = q.list(); 
6 27 return list; 
7 28 } 

方法三:使用原生sql查询<sql-query>,使用此种方式必须把表所有的列写全才可以,否则会出现‘列名无效‘的错误 ,除非你使用return-scalar来设置字段类型。

代码如下:

 1 <hibernate-mapping> 
 2 <class name="com.test.bean.Student" table="student" catalog="users"> 
 3 <id name="id" type="integer"> 
 4 <column name="id" /> 
 5 <generator class="identity" /> 
 6 </id> 
 7 <property name="name" type="string"> 
 8 <column name="name" length="11" /> 
 9 </property> 
10 <property name="age" type="integer"> 
11 <column name="age" /> 
12 </property> 
13 <property name="sex" type="string"> 
14 <column name="sex" length="2" /> 
15 </property> 
16 </class> 
17 <!-- 定义查询语句 --> 
18 <sql-query name="findStudentByName"> 
19 <return alias="s" class="com.test.bean.Student"> 
20 </return> 
21 <![CDATA[select {s.*} from student s where s.name = :name]]> 
22 </sql-query> 
23 </hibernate-mapping> 

备注:也可以在<return/>标记里面应用<return-property/>标记将表的所有字段列出来,与上面描述的方法一样,都是查询出来所有列。

代码如下:

1 public List<Student> query(){ 
2 Session session = HibernateSessionFactory.getSession(); 
3 Query q = session.getNamedQuery("findStudentByName"); 
4 q.setString("name", "zhangsan"); 
5 List<Student> list = q.list(); 
6 return list; 
7 } 

方法四:使用原生sql查询<sql-query>, 如果应用return-scalar来设置字段类型, 就可以实现查询部分字段。

代码如下:

 1 <hibernate-mapping> 
 2 <class name="com.test.bean.Student" table="student" catalog="users"> 
 3 <id name="id" type="integer"> 
 4 <column name="id" /> 
 5 <generator class="identity" /> 
 6 </id> 
 7 <property name="name" type="string"> 
 8 <column name="name" length="11" /> 
 9 </property> 
10 <property name="age" type="integer"> 
11 <column name="age" /> 
12 </property> 
13 <property name="sex" type="string"> 
14 <column name="sex" length="2" /> 
15 </property> 
16 </class> 
17 <!-- 定义查询语句 --> 
18 <sql-query name="findStudentByName"> 
19 <return-scalar column="name" type="string"/> 
20 <return-scalar column="age" type="integer"/> 
21 <![CDATA[select s.name , s.age from student s where s.name = :name]]> 
22 </sql-query> 
23 </hibernate-mapping> 
public List<Object[]> query(){ 
Session session = HibernateSessionFactory.getSession(); 
Query query = session.getNamedQuery("findStudentByName"); 
query.setString("name", "zhangsan"); 
List<Object[]> list = query.list(); 
return list; 
} 
或者: 
public List<Student> query(){ 
Session session = HibernateSessionFactory.getSession(); 
Query q = session.getNamedQuery("findStudentByName"). 
setResultTransformer(Transformers.aliasToBean(Student.class)); 
q.setString("name", "zhangsan"); 
List<Student> list = q.list(); 
return list; 
} 







以上是关于Hibernate命名查询的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate 命名查询数据库或缓存?

org.hibernate.MappingException 命名查询未知

Hibernate-ORM:14.Hibernate中的命名查询

hibernate10--命名查询

Hibernate 命名查询的表名问题

在 Hibernate 命名查询中根据参数选择分组