Hibernate集合最佳获取

时间:2010-06-25 09:44:42

标签: hibernate collections one-to-one

我有以下结构

商店
    回扣
        RebateMetadata
        RebateCommission

所以,关系是这样的 -

商店 - >回扣是一对多的关系 回扣 - > RebateMetadata是一对一的映射 回扣 - > RebateCommission是一对一的映射

我的查询是加载所有商店。并使用它,加载所有回扣和元数据和佣金。

我使用的HQL是:

从Store选择商店作为商店;

我希望尽可能少的SQL加载整个图形。为防止n + 1选择问题,我在Store-> Rebate。

之间使用subselect提取

但是,要获取RebateMetadata和RebateCommission,我会看到多个单独的选择(带有连接)被触发。我该怎么做才能最大限度地减少这种情况?

此外,我打开了第二级缓存,但是QueryCache关闭了。

1 个答案:

答案 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查询)。