Hibernate:拆分查询

时间:2012-06-28 14:10:12

标签: java hibernate optimization jpa hql

(JPA / Hibernate问题) 我有一个查询到一个表,让我们称之为“发布”,我想从中检索一行,以映射到一个实体。 这个实体有五个一对多的关联,这些关联将在不久的将来使用,所以我想急切地获取它们。现在,这些一对多关联中的每一个都有3到300之间的任意行。总而言之,如果实际执行,查询实际上会加载大约一百万行。

因此,对广义HQL查询进行一些预览(括号中的一些注释):

select rv, al, ... (blabla) from 
from Release rv 
left outer join fetch App app (on releaseId)
left outer join fetch Appconfig ac (on appId)
left outer join fetch Appbind ab (on appId)
left outer join fetch Releaseconfig rc (on releaseId)
left outer join fetch Somestuff st (on releaseId)
left outer join fetch Points p (on releaseId)
left outer join fetch Pointconfig pc (on pointId)
left outer join fetch Pointstuff ps (on pointId)
where rv.releaseId = :id

现在,比方说,App有100行,Appconfig和Appbind每个20都为appId; Releasconfig大约15,Somestuff大约20,Points另外130,Pointconfig大约30每个Point和Pointstuff大约50每个Point。 这将导致MASSIVE查询!

有没有办法让我分解查询并让Hibernate映射它们?说,我首先要求App,Appconfig和Appbind,然后单独请求Releaseconfig和Somestuff,然后点,Point,Point和Poinstuff ......

谢谢, 克里斯

1 个答案:

答案 0 :(得分:0)

您可以通过使用查询加载所需的数据,如您所示,例如App,Appconfig和Appbind。你没有强制加载Hibernate的所有其他集合将由代理表示。

然后,当您需要下一个集合时,可以使用Hibernate.initialize()传递代理来强制Hibernate加载它。这将需要单独的查询。