我有以下结构
商店
Rebate RebateMetadata RebateCommission所以,关系是这样的-
Store ->返点是一对多关系返点-> RebateMetadata是一对一映射返点-> RebateCommission是一对一映射
我的查询是加载所有存储。使用它,加载所有回扣、元数据和佣金。
我使用的HQL是:
从store as Store中选择store;
我希望在尽可能少的SQL中加载整个图。为了防止n+1选择问题,我在商店->返点之间使用子选择抓取。
然而,为了获取RebateMetadata和RebateCommission,我看到多个单独的selects(带有连接)被触发。我应该怎么做才能最小化这个问题呢?
此外,我打开了二级缓存,但关闭了QueryCache。
发布于 2010-06-25 18:03:32
你可以试试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文档中链接的倒数第二个示例进行了更新。这更有可能是正确的。
这可能不会起作用,但这是一般的想法。或者,您可以尝试在属性上使用批处理大小(注释@BatchSize),以确保像这样的属性被加载,比方说,一次加载50个项目(使用SELECT...IN查询)。
https://stackoverflow.com/questions/3117018
复制相似问题