hibernate检索方式和检索策略
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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以后版本不建议使用)