当前位置: 首页 > 知识库问答 >
问题:

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

孔永年
2023-03-14

如何在QueryDSL(Java)中实现组计数?

我正在一个表上实现一个分页搜索,我想在返回结果之前对其中的结果进行分组。

除了通常的限制x偏移量y查询外,我还想接收行总数。

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

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

不幸的是,这不会生成包含上一个查询返回的组数的一行,而是为每个组生成一行,每个组包含被分组在一起的行数--与聚合函数的通常情况一样,count在出现groupby时更改其含义。(至少在我们这里使用的Postgresql中。)

我们可以通过将第一个SELECT语句用作from子句中的子SELECT来检索总计数:

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

现在困难的部分:我们如何在JPQL和/或QueryDSL中做到这一点?

QTask qTask = QTask.task;
Expression<?>[] groupExps = { qTask.x, qTask.y };
Predicate predicate = qTask.y.gt(10);

List<Result> results = getQueryDSL().createQuery()
                                    .from(qTask)
                                    .where(predicate)
                                    .groupBy(groupExps)
                                    .offset(0)
                                    .limit(10)
                                    .list(ConstructorExpression.create(Result.class,
                                                                       qTask.x
                                                                       qTask.y,
                                                                       qTask.z.max()))
Long total = getQuerydsl().createQuery()
                          .from(qTask)
                          .where(predicate)
                          .groupBy(groupExps)
                          .singleResult(qTask.x.count());

看起来JPA/JPQL除了在WHERE或HAVING子句中不支持子选择,也就是说,它们在FROM子句中是不可能的。这似乎也是QueryDSL for JPA不支持它们的原因。

有没有一种方法可以重写这个语句,或者以某种方式绕过这个限制?

共有1个答案

吕霍英
2023-03-14

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

什么RDM?以下操作在MS SQL Server中工作。可以使用concatenation、distinct和count来确定将x和y串联起来时有多少唯一值。当按x,y分组时,这应该是相同的行数。

select count(distinct CAST(x as char(10)) + CAST(y as char(10)))
from tasks;
 类似资料:
  • 假设我有bean,具有以下属性: 字符串名 字符串lastName Statusenum Status 如何返回计算结果为true的? 如果上述方法不可取,那么推荐的最佳实践是什么?

  • 我应该用什么来替换'code TO VERIFY IF QUERY RESULT ROW IS=1'? 我用num_rows尝试了很多种方法,但都行不通。 我的PHP代码:

  • 问题内容: 我正在尝试计算由文本字段接收的输入填充的数组的总数,均值和中位数。我设法算出了总数和均值,但我只是无法获得中位数。我认为在执行此操作之前需要对数组进行排序,但是我不确定如何执行此操作。这是问题吗,还是我没有找到另一个问题?这是我的代码: 问题答案: Java中的Arrays类具有静态的排序功能,您可以使用调用该功能。

  • 我试图计算由TextField接收的输入填充的数组的总数、平均值和中位数。我已经算出了总数和平均数,但中位数无法计算出来。我认为在我可以这样做之前需要对数组进行排序,但我不确定如何这样做。是这个问题,还是还有一个我没有找到的?下面是我的代码:

  • 问题内容: 我应该将“如果查询结果行IS = 1进行验证的代码”替换为什么? 我已经尝试过使用num_rows的多种方法,但无法正常工作。 我的PHP代码: 问题答案: 要么

  • 我正在尝试返回一个流操作的结果,在本例中为: 求和列表 取值平方 取值平方 其表示为: 若要访问我使用的值,请执行以下操作 紧随其后的是: 这需要一个阻塞调用来允许流完成,这是不可接受的: 如果我使用: 返回错误: 在本例中,收件人执行元是源,并在消息中返回以下内容: Akka流可以用来返回流中的计算值吗?唯一的替代方法是将计算值存储在DB中,或者当在以下位置计算值时将其发送到Kafka主题: ?