【问题标题】:Subquery filter sum with one to many in JPAJPA中一对多的子查询过滤器总和
【发布时间】:2020-10-22 12:01:28
【问题描述】:

我有 2 个实体:

@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 Contract {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private Integer numberOfClaims;
}

现在我想建立一个javax.persistence.criteria.Predicate 来查找所有numberOfClaims 大于x 的订单。

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 我不记得我尝试过的所有代码,但这里是我想到的一般想法:a) select * from order o where sum(o.contracts.numberOfClaims) > x b) Some使用“have”而不是“where”的查询,但我没有成功使用这种方法 c)使用子选择
  • 我使用休眠来创建我的数据库表。它为我的 2 个实体创建了一个匹配表“order_contract”。我可以使用此选择 SELECT * FROM order o WHERE ( ( SELECT SUM(numberOfClaims) FROM order_contract oc LEFT JOIN contract c ON c.id = oc.contract_id WHERE o.id=oc.order_id ) &gt;= :x) 来获得正确的结果,但我不知道如何使用 jpa 构建此选择

标签: java hibernate jpa spring-data-jpa jpql


【解决方案1】:

试试:

select o from Order o where
(select sum(c.numberOfClaims) from o.contracts c) > x

在以下 cmobilecom-jpa 开发者指南中查看一些相关的子查询示例:

https://cmobilecom.com/docs/jpa/latest/devguide/index.html

使用标准 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);

【讨论】:

  • 感谢您的回答。我尝试了查询并得到了正确的结果。我还查看了指​​南,但我仍然无法将查询转换为谓词(使用Root&lt;Order&gt;, CriteryQuery and CriteriaBuilder)。你能帮帮我吗?
  • 为子查询添加了标准 API。希望对您有所帮助。
  • 像魅力一样工作!非常感谢
猜你喜欢
  • 1970-01-01
  • 2012-10-29
  • 2014-04-18
  • 2015-02-17
  • 1970-01-01
  • 2017-08-20
  • 1970-01-01
  • 1970-01-01
  • 2012-08-22
相关资源
最近更新 更多