给定以下域模型,我想加载所有Answer
s,包括其Value
s和其各自的子孩子,并将其放入中AnswerDTO
,然后转换为JSON。我有一个可行的解决方案,但它遇到了N + 1问题,我想通过使用ad-hoc摆脱它@EntityGraph
。所有关联都已配置LAZY
。
@Query("SELECT a FROM Answer a")
@EntityGraph(attributePaths = {"value"})
public List<Answer> findAll();
使用的ad-hoc @EntityGraph
对Repository
方法我可以确保值是预取的,以防止N + 1上的Answer->Value
相关性。虽然我的结果还不错,但是还有一个N + 1问题,因为延迟加载s 的selected
关联MCValue
。
使用这个
@EntityGraph(attributePaths = {"value.selected"})
失败,因为该selected
字段当然只是某些Value
实体的一部分:
Unable to locate Attribute with the the given name [selected] on this ManagedType [x.model.Value];
我如何告诉JPA仅selected
在值是a的情况下才尝试获取关联MCValue
?我需要类似的东西optionalAttributePaths
。
selected
具有的答案MCValue
。我不喜欢这样做,这将需要一个额外的循环,并且需要管理数据集之间的映射。我喜欢您的想法来利用Hibernate缓存。您能否详细说明依靠高速缓存包含结果的安全性(就一致性而言)?在事务中进行查询时,此功能有效吗?我担心很难发现和零星的懒惰初始化错误。