由于某些HQL查询导致大型笛卡尔积,我遇到了一些性能问题。为了解决这个问题,我试图懒惰地获取集合,尽管我找不到将where子句应用于结果集合的好方法。
原始HQL查询的简化版本
SELECT TPR
FROM TacticalPriceRule
INNER JOIN FETCH TPR.tacticalPriceRuleDurations TPRD
LEFT JOIN FETCH TPR.tacticalPriceRuleCountryOfOrigins as TPRCOO
LEFT JOIN FETCH TPR.tacticalPriceRuleType as TPRT
LEFT JOIN FETCH TPR.tacticalPriceRuleCars as TPRC
WHERE
TPRD.duration.min <= :duration and TPRD.duration.max >= :duration
.... more conditions on other joins
这导致几个小表几乎近100万行。不理想。
如果我尝试使用延迟初始化来执行此操作,则会忽略任何“where”或“with”子句,并且匹配战术定价规则的整个集合都包含在集合中。
同样适用于subselect fetch类型。
谢谢,
丹