文档介绍:第14章用Hibernate检索数据
如果不知道所要寻找的对象的持久化标识,那么就无法通过load()或get()函数来获取持久化对象,这里就需要使用查询。Hibernate支持强大且易于使用的面向对象查询语言(HQL)。如果希望通过编程的方式创建查询,Hibernate提供了完善的按条件(Query By Criteria, QBC)以及按样例(Query By Example, QBE)进行查询的功能。也可以用本地SQL(native SQL)描述查询,Hibernate额外提供了将结果集(result set)转化为对象的支持。本章将详细介绍在Hibernate中如何查询数据
查询基础
序言中提到的几种查询方式虽然方法各有不同,但基本的操作顺序都是一样的,都需要准备查询条件、执行查询操作、处理查询结果。不同的方法需要选择不同的工具类,在个别情况下也可以混用。
执行查询
HQL和本地SQL(native SQL).。这个接口提供了参数绑定、结果集处理以及运行实际查询的方法。总是可以通过当前Session获取一个Query对象,如代码14-1所示,列出了几种使用Quey来执行查询的例子:
这里提前介绍一下什么是HQL?HQL是HibernateQuery Language的缩写,HQL的语法很像SQL的语法,但HQL是一种面向对象的查询语言。因此,SQL的操作对象是数据表和列等数据对象,而HQL的操作对象是类、实例、属性等。下一节将详细介绍它。
用iterate()方法迭代查询结果
在某些情况下,可以使用iterate()方法得到更好的性能。这通常是预期返回的结果在session,或二级缓存(second-level cache)中已经存在时的情况。如若不然,iterate()会比list()慢,而且可能简单查询也需要进行多次数据库访问:iterate()会首先使用1条语句得到所有对象的持久化标识(identifiers),再根据持久化标识执行多条附加的select语句实例化实际的对象。
指定绑定参数
除了JDBC风格的问号(?)接收参数外,接口Query还提供了一种对命名参数(named parameters)参数进行绑定的方法。命名参数(named parameters)在查询字符串中是形如:name的标识符。如果按JDBC绑定参数,Hibernate对参数从0开始计数。
如代码14-3所示,给出了按顺序绑定参数和按名称绑定参数的例子。两者方法相同都是setString()或setInterger(),但方法的第一个参数不同,一个是整数表示顺序,另一个是String类型表示名称。
用Hibernate简单分页
如果需要指定结果集的范围(希望返回的最大行数/或开始的行数),应该使用Query接口提供的方法:
Query q = ("from DomesticPerson person");
(20);
(10);
List persons = ();
可滚动遍历(Scrollable iteration)
如果当前使用JDBC驱动支持可滚动的结果集(),Query接口还可以使用ScrollableResults,允许用户在查询结果中上下移动游标,
注意:使用此功能需要保持数据库连接(以及游标(cursor))处于一直打开状态。如果需要断开连接使用分页功能,请使用setMaxResult()/setFirstResult()。
HQL语句详解
HQL的概念在本章的一开始就做过介绍,它是Hibernate专用的查询语言,语法与SQL类似,但操作的目标是对象。HQL 是完全面向对象的查询语言,因此可以支持继承和多态等特征。
HQL基础
HQL 查询依赖于Query类,每个Query 实例对应一个查询对象。使用HQL 查询可按如下步骤进行:
(1)获取HibernateSession对象;
(2)编写HQL语句;
(3)以HQL语句作为参数,调用Session的createQuery方法创建查询对象;
(4)如果HQL语句包含参数,调用Query 的setXxx方法为参数赋值;
(5)调用Query对象的list等方法遍历查询结果。
用from子句指定数据表
from子句是最简单的HQL语句,也是最基本的HQL语句。from关键字后紧跟持久化类的类名。例如:
from Pers