首先說(shuō)一句:是版本的問(wèn)題!
我寫(xiě)的hql為:
from Department as d where
d.employees.name='Tom';
運(yùn)行時(shí)出現(xiàn)異常:org.hibernate.QueryException:
illegal attempt to dereference collection
是因?yàn)椋涸谏厦娴腍QL語(yǔ)句
中,Department的關(guān)聯(lián)實(shí)體employees是一個(gè)集合,而不直接是一個(gè)Employee實(shí)體。
在
Hibernate3.2.2以前的版本,Hibernate會(huì)對(duì)關(guān)聯(lián)實(shí)體自動(dòng)使用隱式的inner join,
也就是說(shuō)如下SQL語(yǔ)句
不會(huì)有任何問(wèn)題 :from Department as d where d.employees.name='Tom';
從
Hibernate3.2.3以后,Hibernate改變了這種隱式的inner join的策略
對(duì)于如下這條語(yǔ)句:
from
Department as d where d.employees.name='Tom';
如果employees是普通組件屬
性,或單個(gè)的關(guān)聯(lián)實(shí)體,則Hibernate會(huì)自動(dòng)生成隱式的inner join
如果myEvents是也一個(gè)集合,那么對(duì)不起!系
統(tǒng)將會(huì)出現(xiàn) org.hibernate.QueryException: illegal attempt to dereference
collection異常。
據(jù)Hibernate官方說(shuō)法:
這樣可以讓這使得隱含關(guān)聯(lián)更具確定性(原文:This makes
implicit joins more deterministic )。
推薦這樣寫(xiě):
from Department as d inner join fetch
d.employees e where e.name='Tom';