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

2023-12-22

如何在 QueryDSL(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

不幸的是,这不会生成包含前一个查询返回的组数的一行,而是每个组生成一行,每个组包含分组在一起的行数 - 与聚合函数一样,COUNT当a改变它的含义时GROUP BY存在。 (至少在 Postgresql 中,我们在这里使用的是它。)

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

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 子句之外的子选择 https://stackoverflow.com/a/6952119/600500,即它们在 FROM 子句中是不可能的。这似乎是 QueryDSL for JPA 也不支持它们的原因。

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


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

什么RDMS?下面的代码适用于 MS SQL Server。您可以使用串联、非重复和计数来确定串联 x 和 y 时有多少个唯一值。当您按 x,y 分组时,这应该是相同的行数。

select count(distinct CAST(x as char(10)) + CAST(y as char(10)))
from tasks;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何计算 QueryDSL 中结果组的数量? 的相关文章

  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 为什么HashMap不能保证map的顺序随着时间的推移保持不变

    我在这里阅读有关 Hashmap 和 Hashtable 之间的区别 http javarevisited blogspot sg 2010 10 difference Between hashmap and html http javar
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分

随机推荐

  • 禁用命令按钮时,PrimeFaces 6.2 命令按钮标题不起作用

    环境 JSF 2 2 14 PrimeFaces 6 2 我的命令按钮设置如下 当按钮被禁用时 标题将在 PF6 1 中显示 悬停时 但不会在 PF6 2 中显示
  • 模块在本地声明组件,但未导出

    我创建了一个共享模块并声明并导出了其他模块中我需要的组件 import NgModule from angular core import CommonModule from angular common import DateslideC
  • 硒点击坐标没有点击预期的位置

    我需要屏幕抓取使用 ActiveX 控件进行导航的网页 这不是用于用户界面测试目的 而是用于从遗留应用程序下载数据 我遇到的问题是顶部导航是带有 javascript 的完整 ActiveX 不可能通过任何方式获取元素 所以我试图在坐标上单
  • 使用 iOS 6.0 SDK 并针对 iOS 5 Target 进行构建会导致 UIScrollView setMinimumZoomScale 在 iOS 5 模拟器上运行时失败

    i upgraded to Xcode 4 5 and have started using the iOS SDK 6 0 我有一个使用 Xcode 4 4 和 iOS SDK 5 1 开发的通用应用程序 它已经在所有经过测试的设备和模拟
  • 获取 EC2 实例 Java API 的状态

    我正在尝试在 AWS 上自动化一些东西 并且我正在使用 Java API 来执行此操作 我能够启动我想要的实例数量 但我无法找到正确的类或方法来获取实例的当前状态 如运行 停止等 我试过这个 DescribeInstanceStatusRe
  • Java 中的 KDTree 实现

    我正在寻找 Java 中的 KDTree 实现 我已经进行了谷歌搜索 结果似乎很随意 实际上有很多结果 但它们大多只是一次性的小实现 我宁愿找到具有更多 生产价值 的东西 类似于 apache 集合或适用于 NET 的优秀 C5 集合库 我
  • PHP:将 preg_replace 与 htmlentities 一起使用

    我正在写一个RSS to JSON parser作为其中的一部分 我需要使用htmlentities 在描述标签内找到的任何标签上 目前 我正在尝试使用preg replace 但我有点挣扎 我当前的 非工作 代码如下所示 pattern
  • IE10 中的 LinkBut​​tons 不执行回发

    我正在尝试添加一个简单的LinkButton到 ASP NET 4 页面 但它没有调用postback在 IE10 中 代码如下所示 HTML
  • mysql返回更新结果

    我想从 mysql 数据库中选择一堆行并更新这些行的查看属性 这是一种 我已阅读这些 标志 最初我做了这样的事情 update select a b c from mytable where viewed 0 set viewed 1 这可
  • PostgreSQL 与 Postgres Plus

    有谁知道两者之间有什么实质性差异常规 PostgreSQL http www postgresql org and Postgres Plus http www enterprisedb com products postgres plus
  • 如何在 Django/Python 中自动填充 PDF 表单? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有 PDF 表单 我想使用 Django Web 应用程序中的数据自动填充这些表单 然后提供给用户下载
  • config 文件夹中的 main.php 和 main-local.php 之间的区别?

    谁能解释一下两者之间的区别main php and main local php在配置文件夹中 为什么一个人拥有 local 而另一个则没有 你可以阅读配置和环境 https github com yiisoft yii2 app adva
  • Aspectj 覆盖方法的参数

    我正在开发一个方面 用于检查 setter 方法的参数并用 null 值覆盖空字符串 这是我到目前为止的状态 Before execution de foo entity set args java lang String public v
  • 在 VBA 中使用 .NET HashTable 返回类型

    我在 VB NET 中创建了一个 NET 库 并且有一个函数返回一个对象HashTable 我一直在寻找如何在 Excel VBA 中访问 HashTable 对象中的元素 但找不到解决方案 我是 VBA 新手 请原谅我 我已经寻找过 但找
  • Rails 5 Carrierwave 没有与图像匹配的路线

    我需要一些帮助 我正在使用 Rails 5 和 Carrierwave 上传图像 我遇到的问题是图像已保存但不会显示 我得到一个没有路由匹配的 GET 我将图像存储在 Rails root 的上传文件夹中 因为我不希望它们保存在公共环境中目
  • python pandas dataframe按日期条件切片

    我可以使用 python datetime 对象读取和切片 pandas 数据帧 但是我被迫只使用现有日期在索引中 例如 这有效 gt gt gt data
  • Android SQLITE非法状态异常[重复]

    这个问题在这里已经有答案了 我使用以下代码将项目添加到数据库 public static void insertQuestion Context c JSONArray jarr String search throws JSONExcep
  • 通过随机点绘制好看的贝塞尔曲线

    我使用 javascript 和 RaphaelJS 来通过随机点绘制一条平滑的线 并输出到 SVG 该线严格水平移动 不会沿 X 轴返回 目前 我正在使用三次贝塞尔曲线来绘制从一点到另一点的线 问题是 这条线看起来不够好 两条曲线在一个点
  • 在 Android Studio 3.2 中看不到 find-sample-code 选项

    In 文档 https developer android com studio write sample code inline他们讲述查找代码示例选项 导入示例 但我在 Android Studio 3 2 中看不到它们 在代码中 突出
  • 如何计算 QueryDSL 中结果组的数量?

    如何在 QueryDSL Java 中 中实现组计数 背景 我正在表上实现分页搜索 我想在返回结果之前对结果进行分组 除了平常的LIMIT x OFFSET y查询时 我还想接收总行数 这是一页的 简化的 SQL 查询 SELECT x y