将 SQL 查询转换为 JPQL 查询 - 总和具有特定文本值的属性数
Posted
技术标签:
【中文标题】将 SQL 查询转换为 JPQL 查询 - 总和具有特定文本值的属性数【英文标题】:Convert SQL query to JPQL query - sum number of attributes with a specific text value 【发布时间】:2021-05-22 20:57:06 【问题描述】:我的 SQL 查询是
SELECT cust.*, sum(ord.status="Pending") as pendingOrderCount, sum(ord.status="Completed") as completedOrderCount
FROM customer cust
LEFT JOIN item_order ord ON ord.customer_id = cust.id
WHERE cust.tenant_id = 1
GROUP BY cust.id
此查询在 mysql Workbench 中有效
所以本质上我想获取所有客户的属性,然后再添加两个别名,已完成订单的数量是来自该客户的订单数量,其中 order.status 为“完成”,以及每个客户的待处理订单数量
在我的 Spring Boot JPA 存储库类中,我正在尝试使用 JPQL 重新创建此查询。这是我的尝试:
@Query("select cust, sum(ord.status = 'Completed') as completedOrders, sum(ord.status = 'Pending') as pendingOrders from item_order ord LEFT JOIN ord.customer where customer id = 1)
我知道这是不正确的,我的 IDE 在 ord.status = '完成' 和 ord.status = '待定'
在等号处。我一直在查看 JPQL 文档,但没有找到任何获得具有给定值的属性总和的示例,因此请使用一些帮助
【问题讨论】:
见meta.***.com/questions/333952/… 查询已被清理,使用保留关键字是一个错误。我花了几个小时阅读 JPA 和 JPQL 的各种在线资源,但我是 JPA 和 JPQL 的新手,还没有找到与我的用例类似的答案或示例。根据objectdb.com/java/jpa/query/jpql/from#LEFT_OUTER_JOIN 在JPQL 中,似乎LEFT JOIN 可能不使用ON 子句。 以上评论是对 Stawberry 现在删除的 cmets 的回应。 【参考方案1】:我发现了如何根据属性在 JPQL 中的状态有条件地计算属性的数量
sum(case when ord.status = 'Completed' then 1 else 0 end) as completedOrders, sum(case when ord.status = 'Pending' then 1 else 0 end) as pendingOrders
【讨论】:
以上是关于将 SQL 查询转换为 JPQL 查询 - 总和具有特定文本值的属性数的主要内容,如果未能解决你的问题,请参考以下文章