2013-03-18 173 views
8

有没有一种方法可以定义一个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规范触发提前提取(而不必将负载加载到另一个规范)?

+0

我在使用您的方法时出现以下异常:“查询指定的联接抓取,但抓取的关联的所有者未出现在选择列表中”。 – svlada 2015-04-21 19:00:05

+0

或者,是否有这样的方法可以使所有关系都变得懒惰? – chrismarx 2015-11-05 19:20:40

回答

6

我们改进了nullSpecification s和Predicate s在处理DATAJPA-300时的处理。您可能想试试1.4快照,看看这会如何影响您的场景。

+0

快照对我的用例非常合适。谢谢! – shelley 2013-03-19 18:50:49

+0

@Oliver Gierke你真棒兄弟 – 2015-04-03 12:24:02