JPA CriteriaQuery 计算用于 where 谓词的日期时间差

2024-03-14

我正在尝试从数据库中选择两个字段之间的时间差小于或大于某个值的实体。在标准 SQL 中,这可以使用 TIMESTAMPDIFF 函数简单地完成:

SELECT * from run where TIMESTAMPDIFF(SECOND, run.end_time, run.start_time) > 60;

然而,JPA 2.0 中似乎没有任何等效的东西。

我已经尝试了我能想到的一切,包括这里的建议:将 TIMESTAMPDIFF 与 JPA 标准查询结合使用,并将 hibernate 作为提供程序 https://stackoverflow.com/questions/22412234/using-timestampdiff-with-jpa-criteria-query-and-hibernate-as-the-provider

predicate.getExpressions().add(criteriaBuilder.greaterThanOrEqualTo(criteriaBuilder.function("TIMESTAMPDIFF", Long.class, criteriaBuilder.literal("SECOND"), root.get(Run_.endTime), root.get(Run_.startTime)), minSeconds))

根本不起作用,因为我专门尝试计算较长的持续时间(60/90 天)。 TIMEDIFF 解决方案没有帮助,因为可以返回的最大 TIMEDIFF 是 35 天。还有其他方法可以实现此目的吗?


这是等效 JPA Criteria Query 的解释

SELECT * from run where TIMESTAMPDIFF(SECOND, run.end_time, 运行.start_time) > 60;

首先,您必须创建单位表达式并将其扩展为BasicFunctionExpression以“SECOND”参数为单位并覆盖其rendor(RenderingContext renderingContext)仅方法。

import java.io.Serializable;
import org.hibernate.query.criteria.internal.CriteriaBuilderImpl;
import org.hibernate.query.criteria.internal.compile.RenderingContext;
import org.hibernate.query.criteria.internal.expression.function.BasicFunctionExpression;

public class UnitExpression extends BasicFunctionExpression<String> implements Serializable {

  public UnitExpression(CriteriaBuilderImpl criteriaBuilder, Class<String> javaType,
      String functionName) {
    super(criteriaBuilder, javaType, functionName);
  }

  @Override
  public String render(RenderingContext renderingContext) {
    return getFunctionName();
  }
}

然后您在 JPA 标准查询中使用此单位表达式。

    CriteriaBuilder cb = session.getCriteriaBuilder();
    CriteriaQuery<Run> cq = cb.createQuery(Run.class);
    Root<Run> root = cq.from(Run.class);

    Expression<String> second = new UnitExpression(null, String.class, "SECOND");
    Expression<Integer> timeDiff = cb.function(
        "TIMESTAMPDIFF",
        Integer.class,
        second,
        root.<Timestamp>get(Run_.endTime),
        root.<Timestamp>get(Run_.startTime));
    List<Predicate> conditions = new ArrayList<>();
    conditions.add(cb.greaterThan(timeDiff, 60));
    cq.where(conditions.toArray(new Predicate[]{}));
    return session.createQuery(cq);

这是工作。

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

JPA CriteriaQuery 计算用于 where 谓词的日期时间差 的相关文章

  • 如何使用Spring WebClient进行同步调用?

    Spring Framework in 休息模板 https docs spring io spring framework docs current javadoc api org springframework web client R
  • 获取文件的锁

    我想在对特定文件开始 threo read 时获取文件上的锁定 以便其他应用程序无法读取已锁定的文件并希望在线程终止时释放锁定文件 您可以获得一个FileLock https docs oracle com javase 8 docs ap
  • 文本在指定长度后分割,但不要使用 grails 打断单词

    我有一个长字符串 需要将其解析为长度不超过 50 个字符的字符串数组 对我来说 棘手的部分是确保正则表达式找到 50 个字符之前的最后一个空格 以便在字符串之间进行彻底的分隔 因为我不希望单词被切断 public List
  • 删除优先级队列的尾部元素

    如何删除优先级队列的尾部元素 我正在尝试使用优先级队列实现波束搜索 一旦优先级队列已满 我想删除最后一个元素 优先级最低的元素 Thanks 没有简单的方法 将元素从原始元素复制到新元素 最后一个除外 PriorityQueue remov
  • Android 中 localTime 和 localDate 的替代类有哪些? [复制]

    这个问题在这里已经有答案了 我想使用从 android API 获得的长值 该值将日期返回为长值 表示为自纪元以来的毫秒数 我需要使用像 isBefore plusDays isAfter 这样的方法 Cursor managedCurso
  • 为自定义驱动程序创建 GraphicsDevice

    我正在开发一个在嵌入式系统中使用 Java 的项目 我有用于屏幕和触摸输入的驱动程序 以及用于文本输入的虚拟键盘 我的屏幕驱动程序有一个Graphics2D您可以绘制的对象和repaint Rectangle 更新方法 类似地 触摸驱动器能
  • Java:从集合中获取第一项

    如果我有一个集合 例如Collection
  • 如何使用正则表达式验证 1-99 范围?

    我需要验证一些用户输入 以确保输入的数字在 1 99 范围内 含 这些必须是整数 Integer 值 允许前面加 0 但可选 有效值 1 01 10 99 09 无效值 0 007 100 10 5 010 到目前为止 我已经制定了以下正则
  • 如何通过注解用try-catch包装方法?

    如果应该在方法调用中忽略异常 则可以编写以下内容 public void addEntryIfPresent String key Dto dto try Map
  • 从休眠乐观锁定异常中恢复

    我有一个这样的方法 Transactional propagation Propagation REQUIRES NEW public void doSomeWork Entity entity dao loadEntity do some
  • 如何删除日期对象的亚秒部分

    当 SQL 数据类型为时间戳时 java util Date 存储为 2010 09 03 15 33 22 246 如何在存储记录之前将亚秒设置为零 例如 在本例中为 246 最简单的方法是这样的 long time date getTi
  • 通过 appassembler-maven-plugin 生成的脚本无法在 Spring Boot 应用程序中找到主类

    我使用 appassembler maven plugin 生成的启动脚本有问题 我有一个基本的 spring boot 应用程序 只有一个类 SpringBootApplication public class ScriptDemoApp
  • Java:如何确定文件所在的驱动器类型?

    Java 是否有一种独立于平台的方法来检测文件所在的驱动器类型 基本上我有兴趣区分 硬盘 可移动驱动器 如 USB 记忆棒 和网络共享 JNI JNA 解决方案不会有帮助 可以假设 Java 7 您可以使用 Java 执行 cmd fsut
  • 在 Clojure 中解压缩 zlib 流

    我有一个二进制文件 其内容由zlib compress在Python上 有没有一种简单的方法可以在Clojure中打开和解压缩它 import zlib import json with open data json zlib wb as
  • JAVA中遍历JSON数据

    我是 JSON 新手 我使用 HTTPUrlConnections 并在 JAVA 程序中获得一些响应 响应数据将类似于 data id 1 userId 1 name ABC modified 2014 12 04 created 201
  • 避免 Java 中的重复导入:继承导入?

    有没有办法 继承 导入 Example 常见枚举 public enum Constant ONE TWO THREE 使用此枚举的基类 public class Base protected void register Constant
  • 我可以限制分布式应用程序发出的请求吗?

    我的应用程序发出 Web 服务请求 提供商处理的请求有最大速率 因此我需要限制它们 当应用程序在单个服务器上运行时 我曾经在应用程序级别执行此操作 一个对象跟踪到目前为止已发出的请求数量 并在当前请求超出允许的最大负载时等待 现在 我们正在
  • 源值 1.5 的错误已过时,将在未来版本中删除

    我使用 scala maven plugin 来编译包含 scala 和 java 代码的项目 我已经将源和目标设置为1 7 但不知道为什么maven仍然使用1 5 这是我在 pom xml 中的插件
  • 何时在 hibernate 中使用 DiscriminatorValue 注解

    在 hibernate 中使用 DiscriminatorValue 注释的最佳场景是什么以及何时 这两个链接最能帮助我理解继承概念 http docs oracle com javaee 6 tutorial doc bnbqn html
  • HttpClient请求设置属性问题

    我使用这个 HttpClient 库玩了一段时间 几周 我想以某种方式将属性设置为请求 不是参数而是属性 在我的 servlet 中 我想使用 Integer inte Integer request getAttribute obj 我不

随机推荐

  • 如何将 UISearchController 与 SwiftUI 集成

    我有一个符合 UIViewControllerRepresentable 的 SearchController 并且我已经实现了所需的协议方法 但是 当我在 SwiftUI 结构中创建 SearchController 的实例时 加载后 S
  • 如何通过Python使用MySQL的AES_DECRYPT()实现

    我正在尝试编写一个具有相同功能的Python代码AES ENCRYPT and AES DECRYPTMySQL 的 https dev mysql com doc refman 5 6 ja encryption functions ht
  • Swift 4 从错误中获取错误代码

    我有一个定义为错误的变量 这就是我打印它时的样子 Optional Error Domain com apple LocalAuthentication Code 2 Canceled by user UserInfo NSLocalize
  • iOS 模拟器权限被拒绝并且不显示权限警报对话框

    我正在开发 iOS 模拟器 并且面临请求权限的问题 我的应用程序运行正常 可以访问照片库 相机和位置服务 但是安装新的 XCode 8 1 后 我在模拟器上运行该应用程序 该应用程序不再允许使用照片库或相机或位置服务 我尝试以编程方式请求权
  • 将文件路径拖放到 Java Swing JTextField

    Using 这个问题 https stackoverflow com questions 811248 how can i use drag and drop in swing to get file path 我创建了下面的类 它处理将文
  • 将图片读取为灰度numpy数组,并保存回来

    我尝试了以下操作 希望看到源图像的灰度版本 from PIL import Image import numpy as np img Image open img png convert L arr np array img getdata
  • Server.Transfer() 对比服务器.执行()

    我对调用页面 第一页 和调用者页面 新页面 的请求哪个更好或效果感到困惑 我注意到在这两种情况下 浏览器中的 URL 仍然是首页 URL 不会刷新到新页面 URL 因为浏览器没有被请求这样做 任何值得注意的评论 原文位于 Server Tr
  • 强制虚拟方法表中函数的顺序?

    如何控制虚拟表中虚拟函数的顺序 它们的排列顺序是否与声明的顺序相同 当继承带有虚表的类时 继承类的虚表是基类的扩展 还是仅用继承类的虚函数创建的全新虚表 即虚拟表仍然位于类的索引 0x0 处吗 a 就标准而言 你不能 事实上你甚至不能假设
  • Sql Server 2005插入查询中的单引号和双引号

    地址文本框中有单引号和双引号 如何插入数据库 我用的是SQL2005 我的代码如下 str exec sp cust reg customer Cust Id customer Cust Name customer Gender custo
  • Java 中的特殊字符 \0 {NULL}

    如何替换字符串中的 0 NUL String b 2012yyyy06mm sth what i want String c 2 0 0 0012yyyy06mm String d c replaceAll 0 not work Strin
  • 如何调试 Ionic WebApp?

    我想在 WebStorm 中调试我的离子应用程序 我可以在浏览器中运行该应用程序 但我该如何调试呢 我试过 ionic serve debug这似乎不会触发任何调试 当应用程序在浏览器中运行时 如何调试它 使用 Chrome 您可以输入铬
  • 无法在java servlet中获取会话

    我是第一次使用 servlet 但我取得了很大的进步 我的 servlet 运行良好 因此 我决定采用一种身份验证机制 如果用户提供正确的密码和 ID 则会创建一个会话 但会议对我来说是全新的 所以我不太明白这个逻辑 但我已经开始理解了 正
  • Android:如何将图像资源与R.drawable.imagename进行比较?

    我正在开发一个示例应用程序 其中我需要在 onClick 侦听器中获取图像视图的资源 并将其与我知道存在的图像源进行比较 如果资源相同 我想启动另一个意图 我现在面临的问题是访问 ImageView 及其资源 Id 整数 以与可绘制资源进行
  • 检测 jQuery UI 的可拖动功能悬停在什么上方

    我试图让拖动的元素检测它悬停在stopjQuery 的 UI 可拖动功能的事件 这是我的尝试 但没有成功 artwork draggable stop function e ui ui mouseover function f if f t
  • Swift 2:“Bool”无法转换为“BooleanLiteralConvertible”

    我创建了一个应用程序XCode 6 今天我下载了XCode 7它已将我的应用程序更新为Swift 2 错误有很多 但现在只有一个我无法解决 我不知道为什么 但是Xcode不喜欢任何Bool选项animated并显示此错误 Bool 不能转换
  • FindByIdentity 在 ASP.NET Web 应用程序中失败并出现 PrcipalOperationException

    我在内部 Web 应用程序中使用 System DirectoryServices AccountManagement 时遇到问题 该错误不是很具有描述性 但发生的情况如下 当我尝试验证 AD 中是否存在提供的用户 ID 时 我使用以下代码
  • JAXB 异常:此上下文未知类

    当我调用一个特定的静态服务方法时 该方法是使用CXF 我收到以下错误 有人知道为什么以及如何解决它吗 发生 JAXBException 类 com octory ws dto 配置文件Dto也没有任何 其超类的已知 语境 服务方法及相关DT
  • JPA CriteriaBuilder 将合取条件转换为析取条件

    我需要将此查询复制到JPA 标准生成器 code where article client id 1 and article price gt 0 and article code like this is statement or art
  • Windows批处理:睡眠[重复]

    这个问题在这里已经有答案了 如何让 Windows 批处理脚本等待几秒钟 sleep and wait似乎不起作用 无法识别的命令 你可以试试 ping n XXX 127 0 0 1 gt nul 其中 XXX 是等待的秒数加一
  • JPA CriteriaQuery 计算用于 where 谓词的日期时间差

    我正在尝试从数据库中选择两个字段之间的时间差小于或大于某个值的实体 在标准 SQL 中 这可以使用 TIMESTAMPDIFF 函数简单地完成 SELECT from run where TIMESTAMPDIFF SECOND run e