如何在HQL的WHERE子句中实现多列求和筛选
问题分析与解决方案
错误原因
你用到的SUM()是聚合函数,SQL语法规定聚合函数不能直接放在WHERE子句中——WHERE用于过滤单条行数据,而聚合函数是对多行分组后的数据进行计算,只能出现在SELECT或HAVING子句里,这就是报错Invalid use of group function的核心原因。
正确写法分两种场景:
场景1:筛选单条账户记录中amount + paidAmount + fine之和为0的行
这是最常见的需求,此时不需要聚合函数,直接计算三个字段的和即可:
query = session.createQuery("FROM Accounts where accountId = :accId and (amount + paidAmount + fine) = 0 order by name");
注意给字段和加上括号,避免运算优先级问题。
场景2:按accountId分组后,筛选分组内所有记录的amount + paidAmount + fine总和为0的账户
如果一个accountId对应多条Accounts记录,需要统计分组总和,就要用GROUP BY配合HAVING子句:
// GROUP BY需要包含SELECT中所有非聚合字段(比如name),否则会触发数据库语法检查错误 query = session.createQuery("SELECT a FROM Accounts a WHERE a.accountId = :accId GROUP BY a.accountId, a.name HAVING SUM(a.amount + a.paidAmount + a.fine) = 0 ORDER BY a.name");
内容的提问来源于stack exchange,提问作者KJEjava48
相关产品推荐
相关产品推荐

