Hibernate 查询具有嵌套集合的实体的正确方法?

Hibernate 查询具有嵌套集合的实体的正确方法?,hibernate,jpa,spring-data-jpa,Hibernate,Jpa,Spring Data Jpa,当集合元素有自己的集合时,基本查询似乎不起作用 想象一个银行的数据模型,它有客户,有投资组合,有投资。获得客户的正确方式是什么 我试过这个: @Query("SELECT DISTINCT c FROM Customer c LEFT JOIN FETCH c.portfolios") 但由于“未能延迟初始化角色集合”而失败 投资定义为: @ManyToMany(cascade = CascadeType.ALL) 如果我更改fecthType,查询将起作用: @ManyToMany(cas

当集合元素有自己的集合时,基本查询似乎不起作用

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

我试过这个:

@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来定义上述查询。所有实体都有各自的存储库,但看起来获取客户不会接触到公文包存储库中的任何方法(这会留下来加入投资),因此永远不会获取投资


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

您的查询使用
左连接获取来选择客户并获取他们的投资组合。如果还希望获取投资组合的投资,则需要额外的联接获取,就像SQL中一样:

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

这应该可以帮助你:我仍然不明白为什么它适用于具有集合的实体,但不适用于具有集合的集合的实体…只是一个问题,对于多通映射,你仍然会得到错误吗?我还有另一个@OneToMany案例,同样失败。共同点是集合的元素也有集合。您可以尝试不使用DISTINCT吗?您知道它为什么会引发异常吗?我可以理解,如果他尝试访问未初始化的投资,为什么会出现此异常,但在这里他不尝试获取投资,那么为什么失败?我可能完全错了……谢谢,这很有效。但是如果我不需要呢?我如何告诉hibernate/jpa忽略投资,只获取客户和投资组合?如果出现此异常,则表示您正在访问investments集合。如果不需要它们,则执行问题中的查询,而不使用
左连接fetch portfolio.investments
。你得到的异常正好表明投资没有被加载。“如果你得到这个异常,这意味着你正在访问投资集合”-我想知道在哪里会发生这种情况,然后我意识到它已经被转换成JSON(它都是RESTAPI的一部分)。必须是访问投资的JSON转换器!