Java JPA中一对多的子查询筛选器和

Java JPA中一对多的子查询筛选器和,java,hibernate,jpa,spring-data-jpa,jpql,Java,Hibernate,Jpa,Spring Data Jpa,Jpql,我有两个实体: @Entity class Order { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) private Set<Contract> contracts= new HashSet<>(); }

我有两个实体:

@Entity
class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set<Contract> contracts= new HashSet<>();
}
现在我想构建一个javax.persistence.criteria.Predicate来查找NumberOfClaimes大于x的所有订单。

试试:

select o from Order o where
(select sum(c.numberOfClaims) from o.contracts c) > x
请参阅以下cmobilecom jpa开发人员指南中的一些相关子查询示例:

使用标准API:

请参阅“关联到章节子查询的根”一节

CriteriaQuery<Order> criteriaQuery = criteriaBuilder.createQuery(Order.class);
Root<Order> root = criteriaQuery.from(Order.class);
criteriaQuery.select(root);
criteriaQuery.distinct(true);

// Subquery: correlate the root of parent query
Subquery<Integer> subquery = criteriaQuery.subquery(Integer.class);
Root<Order> subqueryRoot = subquery.correlate(root);
Join<Order, Contract> contracts = subqueryRoot.join("contracts");
subquery.select(criteriaBuilder.sum(contracts.get("numberOfClaims")));

Predicate restriction = criteriaBuilder.greaterThan(subquery, x);
criteriaQuery.where(restriction);

到目前为止,您尝试了什么?我不记得我尝试过的所有代码,但以下是我想到的一般想法:a select*from order o where sumo.contracts.numberOfClaims>xb使用have而不是where进行一些查询,但我没有成功地使用这种方法c使用一个使用hibernate的子选择来创建我的db表。它为我的2个实体创建了一个匹配表order_契约。我可以使用这个select select*FROM order o其中select SUMnumberOfClaims FROM order\u contract oc LEFT JOIN contract c ON c.id=oc.contract\u id其中o.id=oc.order\u id>=:x来获得正确的结果,但我不知道如何使用jpaThanks构建这个select来获得您的答案。我尝试了这个查询,得到了正确的结果。我也看了一下指南,但是我仍然无法使用Root、CriteryQuery和CriteriaBuilder将查询转换为谓词。你能帮我吗?为子查询添加了条件API。希望能有帮助。很有魅力!非常感谢你
CriteriaQuery<Order> criteriaQuery = criteriaBuilder.createQuery(Order.class);
Root<Order> root = criteriaQuery.from(Order.class);
criteriaQuery.select(root);
criteriaQuery.distinct(true);

// Subquery: correlate the root of parent query
Subquery<Integer> subquery = criteriaQuery.subquery(Integer.class);
Root<Order> subqueryRoot = subquery.correlate(root);
Join<Order, Contract> contracts = subqueryRoot.join("contracts");
subquery.select(criteriaBuilder.sum(contracts.get("numberOfClaims")));

Predicate restriction = criteriaBuilder.greaterThan(subquery, x);
criteriaQuery.where(restriction);