【问题标题】:how to get total count of results in queries with group by in hibernate?如何在休眠中使用group by获取查询结果的总数?
【发布时间】: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 不允许这种嵌套。

标签: mysql oracle hibernate pagination group-by


【解决方案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 查询更新了我的答案,请试一试
猜你喜欢
  • 1970-01-01
  • 2014-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
  • 2013-11-17
  • 1970-01-01
相关资源
最近更新 更多