登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

清风幻影的博客

Where there is love, I will be there.

 
 
 

日志

 
 
关于我

同是天涯沦落人,相逢何必曾相识. 天生我材必有用,千金散尽还复来. 天若有情天亦老,人间正道是沧桑. 月影西斜人已去, 堤上梅花情依旧, 此情故已成追忆, 美人如玉夜留香

fetch="join" 和 fetch="select" 的区别  

2010-03-19 09:52:58|  分类: hiber_1 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

http://www.javaeye.com/topic/77475

在hibernate3里面多了 fetch的选项,文档里面说得很简单,我知道lazy参数才是决定是否在查询主表的时候去查询子表,但是这个 fetch又起什么作用呢?我测试了一下,发现无论是 fetch="join" 还是 fetch="select",hibernate向数据库发送的 SQL都是一样的。 以一个简单的一对多做例子:

Many 一端

Java代码 fetch=join 和 fetch=select 的区别 - 清风幻影 - 清风幻影的博客

  1. <hibernate-mapping>   
  2.     <class name="lyo.test.hibernate.bean.PostThread" table="thread" catalog="testrails">   
  3.         <id name="id" type="java.lang.Integer">   
  4.             <column name="id" />   
  5.             <generator class="native" />   
  6.         </id>   
  7. <many-to-one name="developer" class="lyo.test.hibernate.bean.Developer"  
  8.           lazy="false"  fetch="join">   
  9.             <column name="developer_id">   
  10.                 <comment></comment>   
  11.             </column>   
  12.         </many-to-one>   
  13.     </class>   
  14. </hibernate-mapping>  

<hibernate-mapping> <class name="lyo.test.hibernate.bean.PostThread" table="thread" catalog="testrails"> <id name="id" type="java.lang.Integer"> <column name="id" /> <generator class="native" /> </id><many-to-one name="developer" class="lyo.test.hibernate.bean.Developer" lazy="false" fetch="join"> <column name="developer_id"> <comment></comment> </column> </many-to-one> </class></hibernate-mapping>

One 一端:

Java代码 fetch=join 和 fetch=select 的区别 - 清风幻影 - 清风幻影的博客

  1. <hibernate-mapping>   
  2.     <class name="lyo.test.hibernate.bean.Developer" table="developer" catalog="testrails">   
  3.         <id name="id" type="java.lang.Integer">   
  4.             <column name="id" />   
  5.             <generator class="native" />   
  6.         </id>   
  7.   <set name="threads" inverse="true" cascade="all">   
  8.             <key>   
  9.                 <column name="developer_id">   
  10.                     <comment></comment>   
  11.                 </column>   
  12.             </key>   
  13.             <one-to-many class="lyo.test.hibernate.bean.PostThread" />   
  14.         </set>   
  15.     </class>   
  16. </hibernate-mapping>  

<hibernate-mapping> <class name="lyo.test.hibernate.bean.Developer" table="developer" catalog="testrails"> <id name="id" type="java.lang.Integer"> <column name="id" /> <generator class="native" /> </id> <set name="threads" inverse="true" cascade="all"> <key> <column name="developer_id"> <comment></comment> </column> </key> <one-to-many class="lyo.test.hibernate.bean.PostThread" /> </set> </class></hibernate-mapping>

测试查询语句:

Java代码 fetch=join 和 fetch=select 的区别 - 清风幻影 - 清风幻影的博客

  1. List list=session.createQuery("from PostThread").list();  

List list=session.createQuery("from PostThread").list();

发现 hibernate向数据库发送的语句都是:

Java代码 fetch=join 和 fetch=select 的区别 - 清风幻影 - 清风幻影的博客

  1. 07:45:11,471 DEBUG org.hibernate.hql.ast.QueryTranslatorImpl.generate:217 - SQL: select postthread0_.id as id0_,  postthread0_.developer_id as developer10_0_  from testrails.thread postthread0_  

07:45:11,471 DEBUG org.hibernate.hql.ast.QueryTranslatorImpl.generate:217 - SQL: select postthread0_.id as id0_, postthread0_.developer_id as developer10_0_ from testrails.thread postthread0_

怎么会没有区别呢? 文档上好像说 join的方式效率高一些,但是是否取子表的数据不是由 lazy参数决定的么,和 fetch 参数有什么关系?

答:

fetch参数指定了关联对象抓取的方式是select查询还是join查询,select方式时先查询返回要查询的主体对象(列表),再根据关联外键id,每一个对象发一个select查询,获取关联的对象,形成n+1次查询;

而join方式,主体对象和关联对象用一句外键关联的sql同时查询出来,不会形成多次查询。

如果你的关联对象是延迟加载的,它当然不会去查询关联对象。

另外,在hql查询中配置文件中设置的join方式是不起作用的(而在所有其他查询方式如get、criteria或再关联获取等等都是有效的),会使用select方式,除非你在hql中指定join fetch某个关联对象。

 

fetch策略用于定义 get/load一个对象时,如何获取非lazy的对象/集合。  这些参数在Query中无效。

  评论这张
 
阅读(1661)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018