我有以下结构
商店
回扣
RebateMetadata
RebateCommission
所以,关系是这样的 -
商店 - >回扣是一对多的关系 回扣 - > RebateMetadata是一对一的映射 回扣 - > RebateCommission是一对一的映射
我的查询是加载所有商店。并使用它,加载所有回扣和元数据和佣金。
我使用的HQL是:
从Store选择商店作为商店;
我希望尽可能少的SQL加载整个图形。为防止n + 1选择问题,我在Store-> Rebate。
之间使用subselect提取但是,要获取RebateMetadata和RebateCommission,我会看到多个单独的选择(带有连接)被触发。我该怎么做才能最大限度地减少这种情况?
此外,我打开了第二级缓存,但是QueryCache关闭了。
答案 0 :(得分:0)
您可以尝试fetch join。通常需要一段时间才能做到正确,尝试类似:
select store from Store as store
left join fetch store.rebate rebate
inner join fetch rebate.metadata
inner join fetch rebate.commission
编辑:根据我在hibernate docs中链接的倒数第二个示例进行了更新。这更有可能是正确的。
这可能不起作用,但这是一般的想法。或者,您可以尝试在属性上使用批量大小(注释@BatchSize
)以确保加载这样的属性,例如,一次加载50个项目(使用SELECT ... IN查询)。