弹簧数据JPA获取
有没有一种方法可以定义一个Spring Data Specification(返回一个JPA谓词),其唯一目的是执行预先抓取?我有一个使用延迟加载定义各种关系的实体,但有几个查询要返回包括所有相关集合在内的整个实体表示,但这些查询的标准可能会有所不同。我见过几篇文章(例如spring forum),讨论了可能引入获取组的可能是理想解决方案;然而,由于这还不是JPA规范的一部分,Spring Data不提供对它的支持。弹簧数据JPA获取
我正在寻找一种可重复使用的方式来执行各种动态查询的预先获取。
例如,我已经考虑开发可重用的规范,其唯一目的是执行预先加载,并且可以与其他规格组合在一起,例如:
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
)时CHAINE d与其他谓词。 (请注意,此谓词单独确实按预期工作;即以下查询将正确取出:repository.findAll(eager());
)。
是否存在可以从“渴望”规范返回的适当的非空谓词,或者是否存在其他可重用的方法来使用Spring Data JPA规范触发提前提取(而不必将负载加载到另一个规范)?
我们改进了null
Specification
s和Predicate
s在处理DATAJPA-300时的处理。您可能想试试1.4快照,看看这会如何影响您的场景。
快照对我的用例非常合适。谢谢! – shelley 2013-03-19 18:50:49
@Oliver Gierke你真棒兄弟 – 2015-04-03 12:24:02
我在使用您的方法时出现以下异常:“查询指定的联接抓取,但抓取的关联的所有者未出现在选择列表中”。 – svlada 2015-04-21 19:00:05
或者,是否有这样的方法可以使所有关系都变得懒惰? – chrismarx 2015-11-05 19:20:40