java - 如何使用急切获取定义 "select *"JPA 谓词?

标签 java jpa spring-data spring-data-jpa

我有以下 3 个实体(注意惰性集合的层次结构):

@Entity
public class ObjectEntity {
   @OneToMany(fetch = FetchType.LAZY)
   Set<ObjectInstanceEntity> instances;
}

@Entity
public class ObjectInstanceEntity {
   @OneToMany(fetch = FetchType.LAZY)
   Set<ObjectInstanceClientEntity> clients;
}

@Entity
public class ObjectInstanceClientEntity {
   //nothing special
}

我还有根实体的 spring-data-jpa 存储库:

public interface ObjectEntityRepository extends JpaRepository<ObjectEntity, UUID>, JpaSpecificationExecutor<ObjectEntity>{
}

我正在尝试使用 Page<T> findAll(Specification<T> spec, Pageable pageable)方法JpaSpecificationExecutor引入一页的 ObjectEntity同时急切地加载所有集合(instances 和instances.clients)。这就是我陷入困境的地方:

private final Specification<ObjectEntity> spec = new Specification<ObjectEntity>() {
    @Override
    public Predicate toPredicate(Root<ObjectEntity> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
        root.fetch("instances", JoinType.LEFT);
        root.fetch("instances.clients", JoinType.LEFT); //this doesnt work
        return cb.; //what do i put here? any(null) ?
    }
};

构造谓词以便引入所有惰性集合的正确方法是什么?

最佳答案

fetch() 方法返回 Fetch可以用作新 fetch() 的“根”的对象。

获取的内容存储在 Root 对象中,您不必返回它。

就您而言:

private final Specification<ObjectEntity> spec = new Specification<ObjectEntity>() {
    @Override
    public Predicate toPredicate(Root<ObjectEntity> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
        root.fetch("instances", JoinType.LEFT).fetch("clients", JoinType.LEFT); //this should work
    }
};

关于java - 如何使用急切获取定义 "select *"JPA 谓词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28987063/

相关文章:

java - Spring JPA @OneToMany 参数值[]与预期类型不匹配

hibernate - Spring Data JPA @EntityListeners w/@Transient @PostLoad,属性未更新

java - jta交易

java - 如何在 JpaRepository 中使用升序降序

java - Spring谓词jpa查询问题

java - 为什么 Java 的 `indexOf` 返回除 (-1) 以外的负数

java - 来自 mysql 连接的 itextpdf pdf

java - 在 debian Xfce 系统上使用 install4j 安装 java 应用程序时出现问题

hibernate - ContentNegotiationManager FactoryBean 的 Spring 问题

java.sql.BatchUpdateException : ORA-00001: unique constraint while we generating primary key