【问题标题】:Spring Data JPA FetchingSpring Data JPA 获取
【发布时间】:2013-03-07 02:36:46
【问题描述】:

有没有办法定义一个 Spring Data Specification(返回一个 JPA 谓词),其唯一目的是执行 Eager fetching?

我有一个使用延迟加载定义各种关系的实体,但是有几个查询我想返回包括所有相关集合在内的整个实体表示,但这些查询的标准可能会有所不同。我看过一些帖子(例如在 spring forum 上)讨论了可能引入 fetch 组,这可能是理想的解决方案;但是,由于这还不是 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));

但是,Eager fetching 规范不是真正的谓词,因此它返回null,并且在与其他谓词链接时会导致明显的问题(即NullPointerExceptions)。

(请注意,此谓词 alone 确实按预期工作;即以下查询将正确获取:repository.findAll(eager());)。

是否有可以从“eager”规范返回的适当的非空谓词,或者是否有任何其他可重用的方法来触发使用 Spring Data JPA 规范的渴望获取(无需将渴望加载到另一个规范上) ?

【问题讨论】:

  • 我在使用您的方法时遇到以下异常:“查询指定连接提取,但提取关联的所有者不在选择列表中”。
  • 或者,是否有这样的方法可以使所有关系变得懒惰?

标签: jpa spring-data spring-data-jpa


【解决方案1】:

在修复DATAJPA-300 的过程中,我们改进了nullSpecifications 和Predicates 的处理。您可能想尝试一下 1.4 快照,看看这对您的场景有何影响。

【讨论】:

  • @Oliver Gierke 你是真棒兄弟
猜你喜欢
  • 2019-11-18
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
  • 2019-09-05
  • 2016-02-03
  • 1970-01-01
  • 2017-07-17
相关资源
最近更新 更多