在 JPA Criteria API 的子查询中使用 ORDER BY 的替代方法有哪些?

2024-01-11

考虑以下两个表:

  1. Project ( id, project_name)
  2. Status ( id, id_project, status_name)

Where Status包含所有状态,其中Project已经是。

假设我们要查询最新状态名称为“new”的所有项目。我想出的Sql查询是:

SELECT q.id_project FROM status q
WHERE q.status_name like 'new'
AND q.id IN (
    SELECT TOP 1 sq.id from status sq
    WHERE q.id_project = sq.id_project 
    ORDER BY sq.id DESC )

我正在尝试使用 Criteria API 复制上述查询,我​​注意到该类标准查询 http://docs.oracle.com/javaee/6/api/javax/persistence/criteria/CriteriaQuery.html有方法orderBy但班级Subquery http://docs.oracle.com/javaee/6/api/javax/persistence/criteria/Subquery.html没有。

到目前为止我提出的条件查询是:

CriteriaQuery<Project> q = criteriaBuilder.createQuery(Project.class);
Root<Status> qFrom       = q.from(Status.class);
Subquery<Integer> sq     = q.subquery(Integer.class);
Root<Status> sqFrom      = sq.from(Status.class);

sq.select(sqFrom.get(Status_.id))
  .where(criteriaBuilder.equal(sqFrom.get(Status_.project), qFrom.get(Status_.project))

我被困在这里是因为Subquery sq没有任何方法对其结果进行排序并仅返回最新的结果。

为了在上述场景中获得所需的结果,有哪些替代方法可以对子查询进行排序?


子查询可以使用以下方式编写SELECT MAX代替SELECT TOP 1 ... ORDER BY ...:

SELECT q.id_project FROM status q
WHERE q.status_name like 'new'
AND q.id = (
    SELECT MAX(sq.id) from status sq
    WHERE q.id_project = sq.id_project)

这也会更快,因为与查找最大值相比,对所有记录进行排序要慢。正如已经发布的,它可以转换为 CriteriaQuery。

不幸的是,条件查询不支持子查询中的排序 - 请参阅以下相关答案:

https://stackoverflow.com/questions/19549616#28233425 https://stackoverflow.com/questions/19549616#28233425 https://stackoverflow.com/questions/5551459#5551571 https://stackoverflow.com/questions/5551459#5551571

另一种选择,如果您really需要一个ORDER BY(例如,在下面的示例中允许一定范围的值)是使用本机查询而不是 CriteriaQuery:

Query query = entityManager.createNativeQuery(
    "SELECT bar FROM foo WHERE bar IN (SELECT TOP 10 baz FROM quux ORDER BY quuux)");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 JPA Criteria API 的子查询中使用 ORDER BY 的替代方法有哪些? 的相关文章

  • 如何在 SQL 中选择“上一条”和“下一条”记录?

    I am building a blog post detail page on my site that will display display a previous and next link similar to how a typ
  • 使用正则表达式验证电子邮件的最大长度

    我找到了用于电子邮件验证的正则表达式 a z0 9 a z0 9 a z0 9 a z0 9 a z 2 4 我希望电子邮件的最大长度为 20 个字符 因此我将其更改为 a z0 9 a z0 9 a z0 9 a z0 9 a z 2 4
  • 是否可以使用 Apache Tika 提取表信息?

    我正在寻找 pdf 和 MS Office 文档格式的解析器 以从文件中提取表格信息 当我看到 Apache Tika 时 正在考虑编写单独的实现 我能够从任何这些文件格式中提取全文 但我的要求是提取表格数据 我希望有 2 列采用键值格式
  • 如何使用 aether 从 Java 找到最新版本的 Maven 工件?

    他们的文档非常薄弱 我无法弄清楚 我找到了部分答案here https stackoverflow com questions 27428068 how to retrieve the latest also snapshot versio
  • T-SQL 中结果集的幂集(所有组合)

    我需要一个 t sql 代码来获取结果集的幂集 输入示例 ColumnName 1 2 3 Example Output one columns as nvarchar 1 2 3 1 2 1 3 2 3 1 2 3 输出集可能包含重复值
  • 递归取消 allOf CompletableFuture

    如果我有 CompletableFuture
  • 删除或更改 ETL 中的记录

    我有一个表 我在上面构建了 ETL 服务 货物记录 到达 离开 进入表格 我已经这样做了 我的桌子将被删除 当项目标识符第二次到达数据库时 两条记录都被删除 label cost time x2 29 14 5 2020 01 00 00
  • SQL 中的代码重用和模块化

    代码重用和模块化对于 SQL 存储过程编程来说是一个好主意吗 如果是这样 将这些功能添加到 SQL 存储过程代码库的最佳方法是什么 我通常为常见且重复的任务创建标量值函数 我发现它不仅可以简化与现有程序类似的新程序的开发 而且还有助于错误跟
  • java绕中心旋转矩形

    我想围绕其中心点旋转一个矩形 它应该保留在应该绘制的位置并在该空间中旋转 这是我的代码 AffineTransform transform new AffineTransform transform rotate Math toRadian
  • 如何获取 JDBC 中 UPDATE 查询影响的所有行?

    我有一项任务需要使用更新记录PreparedStatement 一旦记录被更新 我们知道更新查询返回计数 即受影响的行数 但是 我想要的不是计数 而是受更新查询影响的行作为响应 或者至少是受影响的行的 id 值列表 这是我的更新查询 UPD
  • 始终将双精度舍入

    我怎么总是能把一个double to an int 并且永远不要将其四舍五入 我知道Math round double 但我希望它始终向上舍入 所以如果是的话3 2 四舍五入为 4 您可以使用Math ceil method 请参阅Java
  • MSSQL:如何使用代码编写存储过程创建脚本?

    我正在尝试使用一个数据库中存在但另一个数据库中不存在的 information schema routines 查询存储过程定义列表 SELECT t1 Routine Definition FROM server1 MyDatabase
  • 获取接收者的设备令牌以在 Firebase 中发送通知

    所以我正在学习如何使用 firebase 发送设备到设备的通知 我看到了这个answer https stackoverflow com a 42548586 5237289发送通知 看起来很简单 现在 我知道要获取发件人的令牌 它应该如下
  • 向Java类库添加函数

    我使用的 Java 类库在很多方面都不完整 有很多类我认为应该内置其他成员函数 但是 我不确定添加这些成员函数的最佳实践 让我们调用不足的基类A class A public A long arbitrary arguments publi
  • log4j.properties 在 Wildfly 上无法正常工作

    我的类路径中有一个 log4j properties 文件 它位于 APP XX jar log4j properties 位置 我注意到在ear文件中我还可以在lib文件夹中找到log4j 1 2 17 jar 但无论我在 log4j p
  • 如果 Modelmapper 中的整个属性为空,如何排除它们

    ModelMapper 是否 http modelmapper org http modelmapper org 支持什么排除属性 如果该值为空 我刚刚找到了 PropertyMap 但这对我来说是一种限制 因为我必须描述我想要的特定属性
  • Spring 如何在运行时获取有关“强类型集合”的泛型类型信息?

    我在 Spring 3 0 文档中阅读了以下内容 强类型集合 仅限 Java 5 在 Java 5 及更高版本中 您可以使用强类型集合 使用泛型类型 也就是说 可以声明一个 Collection 类型 使其只能包含 String 元素 例如
  • 亚马逊 Linux - 安装 openjdk-debuginfo?

    我试图使用jstack在 ec2 实例上amazon linux 所以我安装了openjdk devel包裹 sudo yum install java 1 7 0 openjdk devel x86 64 但是 jstack 引发了异常j
  • 假布尔值=真?

    我在一本书中找到了这段代码 并在 Netbeans 中执行了它 boolean b false if b true System out println true else System out println false 我只是不明白为什
  • MyBatis 枚举的使用

    我知道以前有人问过这个问题 但我无法根据迄今为止找到的信息实施解决方案 所以也许有人可以向我解释一下 我有一个表 状态 它有两列 id 和 name id是PK 我不想使用 POJO Status 而是使用枚举 我创建了这样一个枚举 如下所

随机推荐

  • 有没有办法删除逻辑应用运行历史记录/日志?

    有没有办法从逻辑应用中删除所有运行历史记录日志 我知道现在正在测试 日志保留时间 的预览 但删除所有日志的最频繁时间是每周一次 我需要能够更频繁地进行此操作 在本例中是每三天一次 还有其他方法可以删除逻辑应用日志 历史记录吗 EDIT 查看
  • NodeJS 模块安装

    我正在尝试在无法访问互联网的计算机上安装 NodeJS 服务器 我复制了 exe 并执行了它 但现在我需要安装几个模块 所以我的问题是 我可以简单地从我的电脑复制模块吗 或者我必须将服务器连接到互联网并使用 npm 吗 编辑 我已经将所有必
  • Java集群中如何最好地进行文件锁定

    我有一个在 JBoss 上运行的服务器集群 我需要以安全的方式更新文件 具体来说 我需要 锁定文件 A 如果它已经被锁定 则以安全的方式阻塞 这样如果 JVM 突然死机 就不会出现悬空锁 30秒的超时就可以了 读取文件A 改变内容 将文件写
  • t 作为 R 中全局变量的名称:不可能吗?

    我想使用 t 作为 R 中全局变量的名称 但它不允许我这样做 sq1 function t lt lt 7 我收到以下错误 Error in sq1 cannot change value of locked binding for t 我
  • 接收信号的 QML 元素失效了?

    我有类似以下的代码 id myComponent signal updateState property variant modelList Repeater model modelList MyButton Connection targ
  • 3D 空间中向量的旋转和方向 - 逆序

    我在 3D 空间中有两个向量 S 开始 和T 目标 我想找到允许这种变换的旋转矩阵 RM 我知道通过计算叉积 S T我得到了旋转轴 之间的角度S and T是 谁 给的tan S T S T where S T is the 点积S 和 T
  • 使用libavcodec解码H264视频,C

    我正在尝试使用 ffmpeg libavcodec 解码原始 h264 文件 但无法使其正常工作 目前输出应该是原始 YUV 文件 可以用GCC编译代码 gcc o decoder decoder c L lib llibavcodec l
  • 如何使用java.sql.Date节省时间?

    目前 在我的代码中 我正在使用以下 setter 方法将当前日期和时间保存到数据库 但它只保存日期 而不保存时间 emp setJoiningDate new java sql Date System currentTimeMillis 方
  • 可以在 Folium 中绘制路径吗?

    我阅读了许多与此相关的文档 但找不到我想要的东西 我想绘制两点之间的步行路径 是否可以 如果没有 python 中是否有其他库用于此目的 当然可以 使用PolyLine https python visualization github i
  • 无法使用 Google 云存储和 Cloud Functions for Firebase 下载文件

    我遇到的问题与此相反 使用 Cloud Functions for Firebase 和 google cloud storage 删除图像时出现问题 https stackoverflow com questions 43178152 i
  • 有 C++11 CSPRNG 吗?

    众所周知 梅森扭转者加密上不安全 http www math sci hiroshima u ac jp m mat MT efaq html Mersenne Twister 不具有加密安全性 MT 是基于 线性递归 任何由 a 生成的伪
  • 更改默认值“{0} 字段为必填项”(最终解决方案?)

    再会 我有以下用于登录表单的 ViewModel 类 using System ComponentModel DataAnnotations public class UserLogin IDataErrorInfo Required Di
  • 使用 jquery 从 CDATA 和描述标签中获取图像

    如何从 CDATA 和描述标签中获取图像 下面是 XML 代码
  • JavaScript:document.getElementById() 返回 NULL

    我对 Javascript 还很陌生 但 document getElementById 遇到了一个问题 它总是返回 NULL 这让我抓狂 我的代码中有一个元素 我想获取它的坐标 以便可以移动它 这是代码
  • UIDevice currentDevice 模型可能值

    返回的所有可能值是多少 UIDevice currentDevice model 它不是有记录的 http developer apple com library ios documentation uikit reference UIDe
  • Telerik MVC Extensions Grid - 如何将网格过滤器应用于初始 LINQ 查询或传递到数据库?

    目前 在我的 MVC 网格中 我使用普通的服务器绑定 然后将过滤器作为查询字符串附加到 URL 此方法的问题是 如果我查询默认情况下有数千条记录的网格 但我只在网格的第一页 分页过滤器 上显示前 30 条记录 同样的事情也适用于姓氏的字符串
  • Servlet 中的参数化构造函数

    我可以在 servlet 中声明参数化构造函数吗 如果没有那么为什么 No Servlet 实例由容器通过反射创建 它们期望找到一个公共的 无参数的构造函数 默认构造函数 要配置 servlet 请使用 web xml 文件中指定的 ser
  • 具有多个数据库的 SSAS 立方体

    我有 3 个具有相同结构但数据不同的数据库 因为它们来自不同的客户端 现在 我有一个现有的 SSAS 项目 其数据源视图 多维数据集和维度只能使用或访问一个数据库 我想要的是能够使用具有相同结构的多个数据库 并使用它们创建一个多维数据集 每
  • 奇怪的指向成员函数的指针语法

    我了解如何声明函数的类型 typedef void typedef void f typedef void f is void using alias void f void alias void f is void 它可以用来声明函数指针
  • 在 JPA Criteria API 的子查询中使用 ORDER BY 的替代方法有哪些?

    考虑以下两个表 Project id project name Status id id project status name Where Status包含所有状态 其中Project已经是 假设我们要查询最新状态名称为 new 的所有项