hibernate检索方式和检索策略

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Hibernate检索方式和策略

一、Hibernate中对象检索方式

1、导航对象图检索方式

根据已经加载的对象,导航到其他对象。例如,对于已经加载的Customer对象,调用它的getOrderinfos().iterator()方法就可以导航到所有关联的Orderinfo对象,假如在关联级别使用了延迟加载检索策略,那么首次执行此方法时,Hibernate会从数据库中加载关联的Orderinfo 对象,否则就从缓存中取得Orderinfo对象。

2、OID检索方式(object identity)

按照对象的OID来检索对象。Session的get()和load()方法提供了这种功能。如果在应用程序中事先知道了OID,就可以使用这种检索对象的方式。

3、HQL检索方式

使用面向对象的HQL查询语言。Session的find()方法用于执行HQL查询语句。此外,Hibernate还提供了Query接口,它是Hibernate提供的专门的HQL查询接口,能够执行各种复杂的HQL查询语句。本章有时把HQL检索方式简称为HQL。

4、QBC检索方式

使用QBC(Query By Criteria)API来检索对象。这种API封装了基于字符串形式的查询语句,提供了更加面向对象的接口,对特定的po进行查询,利于扩展。本章有时把QBC检索方式简称为QBC。

Criteria中

Expression的or与disjunction类似

And与conjunction类似

5、本地SQL检索方式

使用本地数据库的SQL查询语句。Hibernate会负责把检索到的JDBC ResultSet结果集映射为持久化对象图。

二、高级查询技巧

1、集合过滤(对查询到的集合)

集合过滤示例:

List result=session.createFilter(customer.getOrderinfos(), "where

this.totalprice>200 order by this.totalprice").list();

Session的createFilter()方法用来过滤集合,它具有以下特定。

l、返回Qurey类型的实例。

2、第一个参数:指定一个持久化对象的集合,这个集合是否已经被初始化并没有关系,但它所

属的对象必须处于持久化状态。否则抛出异常。

3、第二个参数:指定过滤条件,它由合法的HQL查询语句组成。

4、不管持久化对象的集合是否已经初始化,Query的list()方法都会执行SQL查询语句,到数据

库中检索Orderinfo对象。

5、如果对象的集合已经被初始化,为了保证Session的缓存中不会出现OID相同的Orderinfo对

象,Query的list()方法不会再创建Orderinfo对象,仅仅返回已经存在的Orderinfo对象的引用。

6、如果没有初始化,Query的list()方法创建相应的对象,但不会初始化所给对象的集合。(仅

仅取出符合条件的对象集合,是对象集合的子集)

集合过滤的几个应用:

A、为集合排序或设置约束条件

B、集合分页

C、检索集合中对象的某个属性

D、检索数据库中与Customer对象的Orderinfos集合中的Orderinfo对象的属性(一个或多个)相

同的所有Orderinfo对象

2、子查询

HQL支持where子句中嵌入查询语句。

from Customer c where 1<(select count(o) from c.orderinfos o) ――相关子查询

from Orderinfo o where o.totalprice>(select avg(o1.totalprice) from Orderinfo o1) 无关子查询

关于子查询的用法说明:

(1)、子查询可以分为相关子查询和无关子查询。

(2)、依赖底层数据库对子查询的支持能力。

(3)、如果子查询语句返回多条记录,可以用一下关键字来衡量。

all:表示子查询语句返回的所有记录。

any:任意的某一条记录。

some:与“any”等价。

in:与“=any”等价。

exists:至少返回一条记录。

例:订单的价格都不小于100的客户

from Customer c where 100<=all (select o.totalprice from c.orderinfos o)

有一条订单的价格小于100的客户

from Customer c where 100>any (select o.totalprice from c.Orderinfos o)

有一条订单的价格等于100的客户

from Customer c where 100=some (select o.totalprice from c.Orderinfos o)

from Customer c where 100=any (select o.totalprice from c.Orderinfos o)

from Customer c where 100 in (select o.totalprice from c.Orderinfos o)

至少有一条订单的客户

from Customer c where exist (from c.Orderinfos o)

三、检索策略

立即检索策略

lazy=”false”(不赞成使用)

迟延检索策略

lazy=”true”

迫切左外连接检索策略

Outer-join=””(在3.0以后版本不建议使用)

相关文档
最新文档