Hibernate3.x教程(四) Hibernate查询方式
2013-03-07 13:31
162 查看
Hibernate支持三种查询方式,分别是HQL、Criteria查询、Native SQL查询。
HQL:
HQL意为Hibernate查询语言(Hibernate Query Language),HQL提供了一种应用与数据库之间的抽象,提高了应用程序在不同的数据库之间的可移植性。HQL语法类似SQL,但是HQL是完全面向对象,对应SQL语句中的表和字段,HQL语句中要使用对象和属性,并且在HQL中对象和属性是大小写敏感的(其他关键字不区分大小写)。也正因此,使用HQL会将表中的记录与对象进行映射。
HQL支持大部分的SQL语法,并且他们的用法也很相似,通常由select、from、where组成,支持聚合函数、排序、分组查询等,具体使用不再一一详述,这里只介绍几点。
1、投影查询
使用HQL是可以省略select子句的,比如:from Student会返回所有学生实例,并且默认查询学生的所有属性。但是对一些较大的业务表使用这种方式也会影响查询性能,这时,是可以使用select子句只查询部分字段,这种查询方式被称为投影查询。例如:
select name from Student 返回学生姓名列表,返回结果为List<String>
select name,age from Student 返回学生姓名和年龄,返回结果为List<Object[]>
如果不想以对象数组的方式返回数据,可以将多个字段封装到对象中返回
select new Student(name, age) from Student 返回学生对象,属性值只包含姓名和年龄
拼写HQL语句之后,是需要通过Session创建Query接口的实现去执行查询。如:
2、HQL分页
HQL分页是使用Query接口提供的setFirstResult()、setMaxResults()方法,分别限定查询起始位置和查询记录数来完成的,Hibernate最终会将分页的限定条件转换成对应数据库的本地SQL。示例代码如下:
3、当结果只有一条记录时,可以使用query.uniqueResult()得到结果;
4、参数定位可以使用?,也可以使用“:参数名”的形式,使用后者会使代码更清晰
Creiteria查询:
Criteria查询方式是通过Hibernate提供的Criteria API动态的构建查询,它也被称为条件查询,一般用于参数数量不定或条件复杂的查询情况(HQL不容易拼写)。但是,强大的HQL通常能够完成所有的查询任务,Crieria查询方式应用不多,这里只通过简单示例介绍一下。
Native SQL:
Native SQL即本地SQL,或称为原生SQL。或许是想使用数据库的某些特性,或许是因为业务逻辑太过复杂HQL执行效率太低等等原因,我们希望使用本地SQL来执行数据库查询或更新。Hibernate对本地SQL查询提供了SQLQuery接口,通过执行session.createSQLQuery()可以获取这个接口。
至于语法就不再讲了,这里只讲一下使用本地SQL需要注意的几点:
1、执行本地SQL无法使用Hibernate缓存,在使用了二级缓存的情况下,执行更新删除操作时,同样也无法被缓存感知,这样会造成缓存与数据库不一致。
2、使用本地SQL查询无法自动映射实体对象,它会返回一个数组集合,就像使用jdbc一样,我们需要对各个属性值逐个获取。代码量极大,并且容易出错。
3、拼写本地SQL语句慎用select * 子句,这样很容易因为数据表结构的变更而导致程序错误,原因见第二条。
代码示例:
Hibernate查询方式代码示例:http://download.csdn.net/detail/boyazuo/5117460
HQL:
HQL意为Hibernate查询语言(Hibernate Query Language),HQL提供了一种应用与数据库之间的抽象,提高了应用程序在不同的数据库之间的可移植性。HQL语法类似SQL,但是HQL是完全面向对象,对应SQL语句中的表和字段,HQL语句中要使用对象和属性,并且在HQL中对象和属性是大小写敏感的(其他关键字不区分大小写)。也正因此,使用HQL会将表中的记录与对象进行映射。
HQL支持大部分的SQL语法,并且他们的用法也很相似,通常由select、from、where组成,支持聚合函数、排序、分组查询等,具体使用不再一一详述,这里只介绍几点。
1、投影查询
使用HQL是可以省略select子句的,比如:from Student会返回所有学生实例,并且默认查询学生的所有属性。但是对一些较大的业务表使用这种方式也会影响查询性能,这时,是可以使用select子句只查询部分字段,这种查询方式被称为投影查询。例如:
select name from Student 返回学生姓名列表,返回结果为List<String>
select name,age from Student 返回学生姓名和年龄,返回结果为List<Object[]>
如果不想以对象数组的方式返回数据,可以将多个字段封装到对象中返回
select new Student(name, age) from Student 返回学生对象,属性值只包含姓名和年龄
拼写HQL语句之后,是需要通过Session创建Query接口的实现去执行查询。如:
Session session = HibernateSessionFactory.getSession(); Query query = session.createQuery("from Student"); List<Student> list = query.list();
2、HQL分页
HQL分页是使用Query接口提供的setFirstResult()、setMaxResults()方法,分别限定查询起始位置和查询记录数来完成的,Hibernate最终会将分页的限定条件转换成对应数据库的本地SQL。示例代码如下:
Session session = HibernateSessionFactory.getSession(); Query query = session.createQuery("from Student"); query.setFirstResult(0); query.setMaxResults(10); List<Student> list = query.list();
3、当结果只有一条记录时,可以使用query.uniqueResult()得到结果;
Session session = HibernateSessionFactory.getSession(); Query query = session.createQuery("select count(id) from Student"); int count = (Integer)query.uniqueResult();
4、参数定位可以使用?,也可以使用“:参数名”的形式,使用后者会使代码更清晰
//使用?定位 Query query = session.createQuery("from Student where age=?"); query.setInteger(0, 20); //使用:参数名的形式定位 Query query = session.createQuery("from Student where age=:age"); query.setInteger("age", 20);
Creiteria查询:
Criteria查询方式是通过Hibernate提供的Criteria API动态的构建查询,它也被称为条件查询,一般用于参数数量不定或条件复杂的查询情况(HQL不容易拼写)。但是,强大的HQL通常能够完成所有的查询任务,Crieria查询方式应用不多,这里只通过简单示例介绍一下。
Session session = HibernateSessionFactory.getSession(); Criteria criteria = session.createCriteria(Student.class) .add(Restrictions.between("age", 16, 18)) .add(Restrictions.like("name", "王%")) .addOrder(Order.desc("id")); List<Student> list = criteria.list();
Native SQL:
Native SQL即本地SQL,或称为原生SQL。或许是想使用数据库的某些特性,或许是因为业务逻辑太过复杂HQL执行效率太低等等原因,我们希望使用本地SQL来执行数据库查询或更新。Hibernate对本地SQL查询提供了SQLQuery接口,通过执行session.createSQLQuery()可以获取这个接口。
至于语法就不再讲了,这里只讲一下使用本地SQL需要注意的几点:
1、执行本地SQL无法使用Hibernate缓存,在使用了二级缓存的情况下,执行更新删除操作时,同样也无法被缓存感知,这样会造成缓存与数据库不一致。
2、使用本地SQL查询无法自动映射实体对象,它会返回一个数组集合,就像使用jdbc一样,我们需要对各个属性值逐个获取。代码量极大,并且容易出错。
3、拼写本地SQL语句慎用select * 子句,这样很容易因为数据表结构的变更而导致程序错误,原因见第二条。
代码示例:
Session session = HibernateSessionFactory.getSession(); Query query = session.createSQLQuery("select id,name,age,grade_id from student"); List<Object[]> result = query.list(); List<Student> list = new ArrayList<Student>(); for (Object[] o : result) { Student s =new Student(); s.setId((Integer)o[0]); s.setName(o[1].toString()); s.setAge((Integer)o[2]); s.setGradeId((Integer)o[3]); list.add(s); }
Hibernate查询方式代码示例:http://download.csdn.net/detail/boyazuo/5117460
相关文章推荐
- 六种方式实现hibernate查询,及IDE推荐
- Hibernate查询方式汇总
- Hibernate之HQL检索(查询)方式
- hibernate查询方式
- Hibernate查询方式汇总
- Hibernate查询方式(补)
- Hibernate 6 种方式实现查询
- Hibernate查询的六种方式
- Hibernate查询方式汇总
- Hibernate的几种查询方式
- hibernate级联查询映射的两种方式
- hibernate的三种查询方式
- 六种方式实现hibernate查询
- hibernate查询方式中load和get的使用
- Hibernate查询方式-QBC查询方式
- hibernate数据查询的几种方式
- hibernate笔记11 Hibernate查询方式
- Hibernate的学习之路二十八(唯一OID和对象导航的查询的方式)
- Hibernate的学习之路三十三(QBC的基本查询方式)
- Hibernate的查询方式