有没有办法定义一个Spring数据规范(返回一个JPA谓词),其唯一目的是执行急切的提取?
我有一个使用延迟加载定义各种关系的实体,但有几个查询我想要返回整个实体表示,包括所有相关集合,但这些查询的标准可能会有所不同。我已经看过一些帖子(例如在spring forum上)讨论了可能引入获取组的帖子,这可能是理想的解决方案;但是,由于这还不是JPA规范的一部分,因此Spring Data不支持它。
我正在寻找一种可重复使用的方法来对各种动态查询执行热切的提取。
例如,我考虑开发一种可重复使用的规范,其唯一目的是执行预先加载,并且可以与其他规范结合使用,例如:
private static Specification<MyEntity> eager() {
return new Specification<MyEntity>() {
@Override
public Predicate toPredicate(Root<MyEntity> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
for (PluralAttribute<? super MyEntity, ?, ?> fetch : root.getModel().getPluralAttributes()) {
root.fetch(fetch, JoinType.LEFT);
}
query.distinct(true);
return null;
}
};
}
本规范的目标是在各种查询中重用它,例如:
repository.findAll(where(eager()).and(otherCriteria).or(otherCriteria));
但是,急切的提取规范不是真正的谓词,因此返回null
,并在与其他谓词链接时会引起明显的问题(即NullPointerExceptions
)。
(请注意,此谓词单独确实按预期工作;即以下查询将正确获取:repository.findAll(eager());
)。
是否有适当的非null谓词可以从&#34; eager&#34;规范,还是有任何其他可重用的方法来触发使用Spring Data JPA规范的急切提取(不必将热切的负载放到另一个规范上)?
答案 0 :(得分:6)
我们在修复DATAJPA-300的过程中改进了对null
Specification
和Predicate
的处理。您可能想尝试1.4快照,看看这会如何影响您的场景。