如何在hibernate中获取group by的查询结果总数?

时间:2016-11-19 11:05:40

标签: mysql oracle hibernate pagination group-by

假设这是我的模特:

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

这是查询结果:

enter image description here

现在,如果我执行此查询以获取总记录数:

select count(*)
  from UserActions t
 group by t.username, t.actionType

这个结果是:

enter image description here

实际上,如果我想获得总记录数,则应该执行如下查询:

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中不起作用。

1 个答案:

答案 0 :(得分: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 
 )