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);