如何在休眠中使用group by获取查询结果的总数?
Posted
技术标签:
【中文标题】如何在休眠中使用group by获取查询结果的总数?【英文标题】:how to get total count of results in queries with group by in hibernate? 【发布时间】:2017-04-03 04:38:42 【问题描述】:假设那是我的模型:
public class UserActions
private int id;
private String username;
private String actionType;
// setter and getters here
现在我想执行下面的查询,并在表格中显示结果并带有分页:
select t.username, t.actionType
from UserActions t
group by t.username, t.actionType
这是查询结果:
现在,如果我执行此查询以获取总记录数:
select count(*)
from UserActions t
group by t.username, t.actionType
这应该是结果:
实际上,如果我想获得总记录数,应该像这样执行查询:
select count(*)
from (
select count(*)
from UserActions t
group by t.username, t.actionType)
但如您所知,上述查询无法执行,因为 hibernate 不支持 from
子句中的子查询。
更新
我很困惑 我发现了一个使用 group by 子句计算总计数的查询:
select sum(count(*) - count(*) + 1)
from UserActions a
group by a.username, a.actionType
它在 oracle 中可以正常工作,但在 postgres 和 mysql 中无法正常工作。
【问题讨论】:
带状态的休眠支持? 您的意思是with
子句吗? no 不支持。
如果你想得到一个总数,为什么不运行简单的SELECT count(*) FROM UserActions t
呢?我不明白你的问题。
因为我想用@krokodilko 分组计算总记录数
关于更新I'm confused i found a query that calculates total count .... it works properly in oracle but doesn't work in postgres and MySql.
- 这是因为Oracle 允许在分组查询中嵌套聚合函数,请参阅文档here 中的第一个示例以及此示例上方的说明。但这不是 ANSII-SQL 标准的特性,其他 DBMS 不允许这种嵌套。
【参考方案1】:
您是对的,Hibernate - 以及 JPA - 不允许在 FROM 子句中使用子查询。
您可以使用本机查询,它应该适用于大多数数据库,因为 from 子句中的子查询是基本的 SQL 构造:
@NativeNamedQuery(
name = "some.name"
query = "SELECT count(*) FROM ( SELECT DISTINCT username, actionType FROM UserActions )"
)
---------- 编辑 ----------
经过一番思考,我设法让它在 Hibernate 中工作,MAX
函数可以解决问题,请尝试以下查询:
SELECT count(*) from UserActions
WHERE id IN (
SELECT max( id )
FROM UserActions
GROUP BY username, actionType
)
【讨论】:
@Rasool Ghafari 我已经用有效的 HQL 查询更新了我的答案,请试一试以上是关于如何在休眠中使用group by获取查询结果的总数?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Group By 和 aliasToBean 的休眠条件查询
SQLDeveloper 运行查询,但从休眠中获得“ORA-00979: Not a Group By expression”