如何计算QueryDSL中结果组的数量?

时间:2014-09-05 16:42:13

标签: java sql jpa jpql querydsl

如何在QueryDSL中实现group-of-groups(在Java中)?

背景

我在桌面上实施分页搜索,我希望在返回结果之前对结果进行分组。

除了通常的LIMIT x OFFSET y查询之外,我还希望收到总行数。

这是一个页面的(简化)SQL查询:

SELECT x, y, MAX(z)
  FROM tasks
 WHERE y > 10
 GROUP BY x, y
 LIMIT 10 OFFSET 0

要检索行数,我尝试使用天真的COUNT(*)代替x, y, MAX(z),如下所示:

SELECT COUNT(x)
  FROM tasks
 WHERE y > 10
 GROUP BY x, y

不幸的是,这并没有产生一行,其中包含前一个查询返回的组数,但是每个组有一行,每行都有一组分组在一起的行 - 通常用于聚合函数,{ {1}}在COUNT出现时更改其含义。 (至少在Postgresql中,我们在这里使用的是什么。)

我们可以使用第一个SELECT语句作为from子句中的子选择来检索总计数:

GROUP BY

现在困难的部分:我们如何在JPQL和/或QueryDSL中执行此操作?

前两个查询是由以下代码生成的:

SELECT COUNT(*)
FROM ( SELECT x, y, MAX(z)
         FROM tasks
        WHERE y > 10
        GROUP BY x, y
     )

它看起来像JPA/JPQL doesn't support subselects other than in WHERE or HAVING-clauses,即它们在FROM子句中是不可能的。这似乎是JPA的QueryDSL也不支持它们的原因。

有没有办法重写这个声明,或以某种方式解决这个限制?

1 个答案:

答案 0 :(得分:2)

我无法帮助你解决jpa和jql,但这是一个有趣的SQL问题......

什么是RDMS?以下适用于MS SQL Server。您可以使用串联,distinct和count来确定连接x和y时有多少唯一值。当您按x,y分组时,这应该是相同的行数。

select count(distinct CAST(x as char(10)) + CAST(y as char(10)))
from tasks;
相关问题