hibernate隐式连接与显示连的区别是什么



hibernate隐式连接与显示连的区别是什么?

(1)隐式连接底层转换成SQL92的内连接,显示连接层将转换成SQL99的多表连接。

(2)隐式连接和显示连接查询后返回的结果不同。

当HQL语句中省略select关键字,用隐式连接查询返回的结果是多个被查询实体组成的集合。

当HQL语句中省略select关键字时,使用显示连接查询返回的结果也是集合,但集合元素是被查询持久化对象、所有被关联的持久化对象所组成的数组。

对于Hibernate3.2.3以后的版本,如果关联实体是单个实体或单个的组件属性,HQL依然可以似乎用英文点号(.)来隐式连接关联实体或组件;但如果关联实体是集合(包括1-N关联、N-N关联和集合元素时组件等),则必须使用xxx join来显示连接关联实体或组件。

对于集合属性的,Hibernate默认采用延迟加载策略,解决办法:

(2.1)可以在Hibernate映射文件中指定lazy=”false”来关闭延迟加载。

(2.2)使用join fetch,通常无须指定别名,因为相关联的对象不应当在where子句(或其他任何子句)中使用。而且被关联的对象也不会再被查询的结果中直接返回,而是应该通过其父对象来访问。


使用fetch关键字时,有如下几个注意点:

fetch不应该与setMaxResults()或setFirstResult()共用。因为这些操作是基于结果集的,而在预先抓取集合类时可能包含重复的数据,即无法预先知道精确的行数。

fetch不能与独立的with条件一起使用。

如果在一次查询中fetch多个集合,可以查询返回笛卡尔积,因此请多加注意。

对bag映射而言,同时join fetch多个集合时可能出现非预期结果,因此需要谨慎使用。

full join fetch 与right join fetch是没有任何意义的。

程序里希望预加载那些原本应延迟加载的属性,则可以通过fetch all properties来强制Hibernate立即抓取这些属性。例如:

from Document fetch all properties order by name