2013-04-08 45 views
0

当收集元素具有自己的集合时,它看起来像基本查询不起作用。查询具有嵌套集合的实体的正确方法?

想象一下银行的客户数据模型,客户拥有投资组合。什么是获得客户的正确方式?

我尝试这样做:

@Query("SELECT DISTINCT c FROM Customer c LEFT JOIN FETCH c.portfolios") 

但它失败,“无法懒洋洋地初始化角色的集合”。

投资的定义是:

@ManyToMany(cascade = CascadeType.ALL) 

查询将工作,如果我改变fecthType:

@ManyToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER) 

但是,有没有办法让它不改变fetchtype工作?

编辑:

我要指出,我用Spring的JpaRepository定义上面的查询。所有实体都有它们各自的存储库,但它看起来像提取客户不会触及Portfolios存储库中的任何方法(这会左击加入投资),因此投资永远不会被提取。

此外,我可以使用类似的查询获取投资组合,并且它可以正常工作,因为投资没有任何集合。但是提取连锁客户 - >投资组合 - >投资失败。

+2

这会帮助你:http://stackoverflow.com/questions/5404599/failed-to -lazily-initialize-a-collection-of-role – DessDess 2013-04-08 09:03:22

+0

我还是不明白它为什么适用于具有集合的实体,但不适用于具有集合的集合的实体... – wannabeartist 2013-04-08 10:40:20

+0

只是一个问题,带有ManyToOne映射仍然得到错误? – DessDess 2013-04-08 12:23:26

回答

1

您的查询使用left join fetch选择客户并提取其投资组合。如果你也想获取投资组合的invstments,你需要一个额外的连接抓取,就像SQL:

select distinct c FROM Customer c 
left join fetch c.portfolios portfolio 
left join fetch portfolio.investments 
+0

您是否有任何线索知道为什么会抛出异常?我会理解,为什么他如果尝试访问投资时会得到这个例外,因为他们没有初始化,但在这里他不想获取投资,为什么它会失败?我可能会完全错误... – DessDess 2013-04-08 13:49:46

+0

谢谢,这是有效的。但如果我不需要他们呢?我如何告诉hibernate/jpa忽略投资,只有客户和投资组合? – wannabeartist 2013-04-08 13:50:48

+1

如果您遇到此异常,则表示您正在访问投资集合。如果你不需要它们,那么在你的问题中执行查询,而不用'left join fetch portfolio.investments'。你得到的例外恰恰说明投资没有被加载。 – 2013-04-08 13:56:08