您的位置:首页 > 其它

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接口的实现去执行查询。如:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: