如何在休眠中使用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 的休眠条件查询

当查询有 GROUP BY 时如何获得总数的百分比?

百分比行占总数,其中每行由 group by 子句确定

SQLDeveloper 运行查询,但从休眠中获得“ORA-00979: Not a Group By expression”

仅休眠错误:“列必须出现在 GROUP BY 子句中或在聚合函数中使用”

如何使用 where 和 Group by 返回多个总和结果