Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何计算QueryDSL中的结果组数?_Java_Sql_Jpa_Jpql_Querydsl - Fatal编程技术网

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

Java 如何计算QueryDSL中的结果组数?,java,sql,jpa,jpql,querydsl,Java,Sql,Jpa,Jpql,Querydsl,如何在QueryDSL(Java)中实现组计数 背景 我正在表上实现分页搜索,在返回结果之前,我希望对结果进行分组 除了通常的限制x偏移量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)

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

背景

我正在表上实现分页搜索,在返回结果之前,我希望对结果进行分组

除了通常的
限制x偏移量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
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());
不幸的是,这不会生成一行,其中包含上一次查询返回的组数,而是为每个组生成一行,每个组都包含分组在一起的行数–与聚合函数的通常情况一样,
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中做到这一点

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

SELECT COUNT(x)
  FROM tasks
 WHERE y > 10
 GROUP BY x, y
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());
QTask QTask=QTask.task;
表达式[]groupExps={qTask.x,qTask.y};
谓词=qTask.y.gt(10);
列表结果=getQueryDSL().createQuery()
.from(qTask)
.where(谓词)
.groupBy(groupExps)
.偏移量(0)
.限额(10)
.list(ConstructorExpression.create(Result.class、,
qTask.x
qTask.y,
qTask.z.max())
Long total=getQuerydsl().createQuery()
.from(qTask)
.where(谓词)
.groupBy(groupExps)
.singleResult(qTask.x.count());
看起来,也就是说,它们在FROM子句中是不可能的。这似乎是QueryDSL for JPA也不支持它们的原因


有没有办法重写这个语句,或者绕过这个限制?

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

什么RDMS?以下内容适用于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;

实际上,我得到了一个SQL解决方案,在我的问题中使用了subselect。我只是有问题如何告诉JPA(和QueryDSL)。(顺便说一句,我使用的是Postgresql。)那么您实际上是在连接行,然后在结果上使用“distinct”来查看总计数?我将尝试是否可以在QueryDSL中实现这一点,以及它是否比仅仅检索所有内容并依靠客户端更快。正确。连接,然后只计算不同的值。我承认这不是一个理想的解决方案,但我只是接受了在from子句中没有子查询的情况下查找聚合查询的行数的挑战,您说过这在QueryDSL中是不可能的。希望在某种程度上有所帮助。我也在寻找类似问题的解决方案,如下面的
selectcount(*)as count from(selectcount(stock0.stock_‌​id)作为库存0的列,其总和(库存0数量)>=10‌​0)tbl