[转]Hibernate中的outer-join(二):fetch

    这篇文章挺好的.


Hibernate中的outer-join(二):fetch

 

<link media="all" href="/tf-resource/css/outputText/tf-outputText.css" type="text/css" rel="stylesheet">在hibernate3里,提供了一个新的属性:fetch。可以用fetch来代替outer-join。

 
Hibernate3的one-to-one/many-to-one属性里增加了一个fetch属性。

fetch属性可以为:select或者join。
当设置为join的时候,采用外联结方式查询,具体参考 上篇文章。


另外hibernate3里可以在HQL里明确指定fetch:
"From Student as s JOIN FETCH s.classz"
表示查询Student的时候,采用外联结方式查询classz表。

在这里补充说明一下,为什么有时需要外联结查询。
举例说明:
有2个表User 和 Contact两个对象分别对应数据库中 用户 和 联系地址 两张表。User 和 Contact是一对一关联。如果不采用外联结查询的话,问题就出现了,如果
   1. From User where rownum < 100,
这时就会:
先执行:
   select * from user

然后针对每个user执行
   select * from contact where user_id=?

也就是说,用一条SQL语句就能查询出来的功能,采用hibernate HQL查询,却需要请求数据库 1+n 次(这个例子执行了101次数据库查询)。

为什么会出现这种情况呢?
这是由于one-to-one的固定机制造成的。如果不采用外联结查询方式,查询出User数据的时候,这时并不能从User数据知道Contact数据存不存在,必须进行数据库查询。

为了减少这种不必要的数据库查询,可以设置查询时采用外联结方式。
但要注意一点的是,采用外联结方式虽然可以减少数据库查询次数,但如果采用cache或者二级cache,因为外联结的查询条件的不确定性,会大大降低缓存/二级缓存的效果。

所以具体怎么定,还要根据业务来定。

你可能感兴趣的:(sql,Hibernate,css,cache)