如何在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也不支持它们的原因。
有没有办法重写这个声明,或以某种方式解决这个限制?
答案 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;