Hibernate 急切地初始化子集合休眠
我有一个类Hibernate 急切地初始化子集合休眠,hibernate,jpa,jpql,Hibernate,Jpa,Jpql,我有一个类A,它有B的集合:列表bList。另外,B类有C的集合:列表cList 问题:如何在初始化所有集合的情况下获取对象 此NamedQuery工作不正确(它返回许多重复的B): 使用选择不同的a而不是选择a。它将删除结果中的所有重复条目。你的问题是: SELECT DISTINCT a FROM A a LEFT JOIN FETCH a.bList bList LEFT JOIN FETCH bList.cList WHERE a.id = (:id) 你的问题很好。Fetch
A
,它有B
的集合:列表bList
。另外,B
类有C
的集合:列表cList
问题:如何在初始化所有集合的情况下获取对象
此NamedQuery
工作不正确(它返回许多重复的B):
使用选择不同的a而不是选择a。它将删除结果中的所有重复条目。你的问题是:
SELECT DISTINCT a FROM A a
LEFT JOIN FETCH a.bList bList
LEFT JOIN FETCH bList.cList
WHERE a.id = (:id)
你的问题很好。Fetch join应具有重复项。你需要处理这些问题。看这里:我不确定这是否有效@Alan Hay:当我们在HQL中使用DISTINCT关键字时,它不会强制数据库过滤不同的对象。相反,当resultset被编组到对象中时,重复项的过滤在内存中发生。当然,这种机制会减慢进程,因为它需要处理内存中的重复条目,但至少从用户的角度来看,返回的结果是我们所期望的。很抱歉,它不起作用。它仍然返回重复项。(很抱歉,上面的查询只会删除实例的重复项,但我在
bList
中有重复项。Thanks@user3005451.很公平,但这并不能解决问题。如果不改变应用程序的语义,您可以在B和C的集合中从List
更改为Set
,以消除重复。
SELECT DISTINCT a FROM A a
LEFT JOIN FETCH a.bList bList
LEFT JOIN FETCH bList.cList
WHERE a.id = (:id)