如何在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不支持它们的原因。
有没有一种方法可以重写这个语句,或者以某种方式绕过这个限制?
我无法帮助您解决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主题: ?