【问题标题】:How do I query "older than three minutes" in JPA?如何在 JPA 中查询“超过三分钟”?
【发布时间】:2013-08-29 07:46:30
【问题描述】:

有没有办法在 JPA 查询中放置引用当前时间的日期范围条件(跨数据库兼容)?

我可以的

SELECT m FROM Mail m WHERE m.sentAt < :date

但我想这样做而不必绑定参数(这样可以将其配置为命名查询存储库的一部分,并且日期计算逻辑不必输入调用代码)。

所以我需要“currentTime 减去 3 分钟”而不是 :date 作为硬编码文字。

【问题讨论】:

标签: datetime jpa jpql


【解决方案1】:

如果您使用的是Hibernate JPA 实现和Oracle 方言,那么您可以使用返回当前日期和时间的SYSDATE 函数。如果您将 1 加到 SYSDATE 它将增加一天。

还支持添加分数:

  • sysdate + 1/24 将增加一个小时
  • sysdate + 1/(24*60) 会加一分钟
  • sysdate + 1/(24*60*60) 会加一秒

所以我需要“currentTime 减去 3 分钟”而不是 :date 作为硬编码文字。

sysdate - 3/(24*60) 将从当前日期和时间中减去 3 分钟:

SELECT m FROM Mail m WHERE m.sentAt < sysdate - 3/(24*60)

超过 3 分钟的记录将被返回,无需参数绑定。

【讨论】:

  • 如果我使用上面的表达式,就会出现“左表达式不是算术表达式”错误
  • 您使用的是 EclipseLink JPA 实现吗?我不确定它是否适用于 EclipseLink。它绝对适用于 Oracle 数据库之上的 Hibernate JPA 实现。
【解决方案2】:

JPA 支持 CURRENT_TIMESTAMP 和 CURRENT_TIME 函数。

https://en.wikibooks.org/wiki/Java_Persistence/JPQL#Functions

JPA 规范没有日期函数,但一些 JPA 提供程序(例如 EclipseLink)有。

http://java-persistence-performance.blogspot.com/2012/05/jpql-vs-sql-have-both-with-eclipselink.html

JPA 2.1 还定义了 FUNCTION 运算符来调用数据库函数。

我会在 EclipseLink 中尝试,

SELECT m FROM Mail m WHERE m.sentAt < SQL("(sysdate - interval '3' minute)")

或者,

SELECT m FROM Mail m WHERE m.sentAt < SQL("(? - interval '3' minute)", CURRENT_TIMESTAMP)

【讨论】:

  • 双引号不正确,必须换成单引号。
  • 获取'必须指定函数名'
猜你喜欢
  • 1970-01-01
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
  • 2014-05-11
  • 2021-04-19
相关资源
最近更新 更多