0

我有以下结构

店铺
返利返利
元数据返利
佣金

所以,关系是这样的——

Store -> Rebate 是一对多关系 Rebate -> RebateMetadata 是一对一映射 Rebate -> RebateCommission 是一对一映射

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

我使用的 HQL 是:

从商店中选择商店作为商店;

我希望以尽可能少的 SQL 加载整个图表。为了防止 n+1 选择问题,我在 Store-> Rebate 之间使用子选择获取。

但是,为了获取 RebateMetadata 和 RebateCommission,我看到多个单独的选择(带有连接)被触发。我应该怎么做才能最小化这种情况?

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

4

1 回答 1

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

编辑:根据我在休眠文档中链接的倒数第二个示例进行更新。这更有可能是正确的。

这可能行不通,但这是一般的想法。或者,您可以尝试在属性上使用批量大小(注释@BatchSize)来确保像这样的属性一次加载,例如 50 个项目(使用 SELECT...IN 查询)。

于 2010-06-25T10:03:31.720 回答