hibernate的优化-抓取(fetch)---张国亮总结心得第三季
2013-01-04 15:38
405 查看
在HQL语句中使用抓取连接查询,通过写一条leftjoinfetch语句把相关联的两个实体的数据一次性从数据库中加载上来。这样可以在特定情况下(同时需要使用到这两个实体的数据)减少SQL的数量来提高查询效率。通过配置“抓取策略”来直接影响session的get()和load()方法的查询效果。
1.单端关联<many-to-one><onr-to-one>上的抓取策略。
可以给单端关联的映射元素添加fetch属性。fetch属性有2个可选值.
select:作为默认值,它的策略是当需要使用到关联对象的数据时,另外单独发送一条select语句抓取当前对象的关联对象的数据。即延迟加载。
join:它的策略是在同一条select语句使用连接来获得对象的数据和它关联对象的数据,此时关联对象的延迟加载失效。
2.集合属性上的抓去策略
在集合属性的映射元素上可以添加fetch属性,它有3个可选值。
select:作为默认值,它的策略是当需要使用所关联集合的数据时,另外单独发送一条select语句抓取当前对象的关联集合,即延迟加载。
join:在同一条select语句使用连接来获得对方的关联集合。此时关联集合上的lazy会失效。
subselect:另外发送一条查询语句(或子查询语句)抓取在前面查询到的所有实体对象的关联集合。这个策略对HQL的查询也起作用。当fetch为join时,执行左外连接,这个时候,在加载Customer时,Customer所对应的Order值全部被加载到缓存中,如果Order中没有大数据,这个策略是一个不错的选择。当fetch为subselect时,针对in有效,如果为select时,from
Customerwhereidin(1,2,3),hibernate会把ID取出来,逐一的去取Order的值,效率比较低。这个时候subselect效率比较高,不管in里含有多少数据,在查询Order是,只会发出一条sql语句。
把<set>集合中batch-size设置为一个比较合适的数值时也相当于fetch为subselect,你可以根据项目的因素来选择发出sql语句的次数。HQL总是忽略映射文件中设置的预先抓取策略,即在HQL中使用预先抓取时,必须显示指明fetch关键字。然而不同的是,QBC则不会忽略映射文件中的预先抓取策略。
在实践开发项目过程中,不仅需要根据实际情况选择合适的抓取策略,而且需要通过不断的测试来验证这个策略是不是最有效率的。
关联级别检索策略
3.案例分析
映射文件:
<keycolumn="cid"/>
<one-to-manyclass="Orders"/>
</set>
测试:
@Test
publicvoidtestFetch(){
Sessionsession=HibernateUtil.getSession();
Customercus=(Customer)session.get(Customer.class,3);
//下面的语句也会在sql语句后一下输出
System.out.println(cus.getCname());
Set<Orders>orders=cus.getOrd();
System.err.println(orders.size());
HibernateUtil.close();
}
//测试fetch="subselect"和batch-size="2";两者任选其一
@Test
publicvoidtestSubselect(){
Sessionsession=HibernateUtil.getSession();
List<Customer>cus=session.createQuery("fromCustomercwherec.idin(1,2,3)").list();
for(Customerc:cus){
System.err.println(c.getCname());
}
HibernateUtil.close();
}
映射文件:
测试:
publicvoidtestHQL(){
Sessionsession=HibernateUtil.getSession();
List<Orders>ord=session.createQuery("fromOrders").list();
HibernateUtil.close();
}
相关文章推荐
- hibernate的优化-抓取(fetch)---张国亮总结心得第三季
- hibernate的优化-抓取(fetch)---张国亮总结心得第三季
- 心得14-hibernate的优化2-抓取(fetch)
- hibernate的优化-懒加载(lazy)----张国亮总结心得第二季
- 心得14-hibernate的优化2-抓取(fetch)
- hibernate的优化-懒加载(lazy)----张国亮总结心得第二季
- hibernate的优化-懒加载(lazy)----张国亮总结心得第二季
- hibernate的优化-懒加载(lazy)----张国亮总结心得第二季
- hibernate之优化抓取(关于fetch属性)
- Hibernate高级---张国亮总结心得第一季
- Hibernate高级---张国亮总结心得第一季
- Hibernate高级---张国亮总结心得第一季
- 框架 day33 Hibernate,组件映射,继承映射,抓取(检索)策略-优化,检索方式总结
- EL表达式-11大隐式对象---张国亮总结心得第三季
- Hibernate 组件映射---> 张国亮总结第三季
- EL表达式-11大隐式对象---张国亮总结心得第三季
- Hibernate 组件映射---> 张国亮总结第三季
- EL表达式-11大隐式对象---张国亮总结心得第三季
- Hibernate 组件映射---> 张国亮总结第三季
- JDBC增删改查模版编写与案例 --->张国亮总结心得第二季