如何在JPA中查询“超过三分钟”?

时间:2013-08-29 07:46:30

标签: datetime jpa jpql

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

我能做到

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

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

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

2 个答案:

答案 0 :(得分:3)

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)

答案 1 :(得分:3)

如果您使用 Hibernate JPA 实现和 Oracle 方言,那么您可以使用返回当前日期和时间的SYSDATE函数。如果您向SYSDATE添加1,则会添加一天。

还支持添加分数:

  • sysdate + 1/24将添加一小时
  • sysdate + 1/(24*60)将添加一分钟
  • sysdate + 1/(24*60*60)将添加第二个
  

所以代替:date我需要“currentTime减去3分钟”作为硬代码字面。

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

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

将返回超过3分钟的记录,并且不需要参数绑定。