首先說一句:是版本的問題!
我寫的hql為:
from Department as d where d.employees.name='Tom';
運行時出現異常:org.hibernate.QueryException: illegal attempt to dereference collection
是因為:在上面的HQL語句 中,Department的關聯實體employees是一個集合,而不直接是一個Employee實體。
在 Hibernate3.2.2以前的版本,Hibernate會對關聯實體自動使用隱式的inner join,
也就是說如下SQL語句 不會有任何問題 :from Department as d where d.employees.name='Tom';
從 Hibernate3.2.3以后,Hibernate改變了這種隱式的inner join的策略
對于如下這條語句:
from Department as d where d.employees.name='Tom';
如果employees是普通組件屬 性,或單個的關聯實體,則Hibernate會自動生成隱式的inner join
如果myEvents是也一個集合,那么對不起!系
統將會出現 org.hibernate.QueryException: illegal attempt to dereference
collection異常。
據Hibernate官方說法:
這樣可以讓這使得隱含關聯更具確定性(原文:This makes
implicit joins more deterministic )。
推薦這樣寫:
from Department as d inner join fetch d.employees e where e.name='Tom';