将 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 查询 - 总和具有特定文本值的属性数的主要内容,如果未能解决你的问题,请参考以下文章

将此 JPQL 查询转换为 SQL 查询

条件查询,SQL,JPQL,HQL

JPA JPQL简介

SQL到JPQL - 哈希因公式

JPA 多对多JPQL查询语句怎么写?

JPQL 查询参数中的时间戳未转换为 UTC