提问者:小点点

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


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

我可以做

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

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

因此,我需要“当前时间减3分钟”作为硬代码文字,而不是: date


共3个答案

匿名用户

JPA支持CURRENT_TIMESTAMP和CURRENT_TIME功能。

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

JPA规范没有日期功能,但一些JPA提供程序(例如EcliseLink)有。

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

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

在EcliseLink中我会尝试,

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)

匿名用户

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

还支持添加分数:

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

因此,我需要“当前时间减3分钟”作为硬代码文字,而不是: date。

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

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

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

匿名用户

我有一个类似的问题,但我能够解决它。也许这将有助于在未来:

这对我使用springframe和H2数据库工作:

current_time

我发现在分钟内使用整数列时需要显式转换为双精度,否则它会自动舍入为0。

对于硬编码的分钟,这应该可以:

从邮件中选择m m WHERE m. sentAt