Reputation: 262504
Is there a way to put a date range condition referencing the current time in a JPA query (that is compatible across databases)?
I can do
SELECT m FROM Mail m WHERE m.sentAt < :date
but I want to do it without having to bind a parameter (so that this can be configured as part of the named query repository and the date calculation logic does not have to enter the calling code).
So instead of :date
I need "currentTime minus 3 minutes" as a hard-code literal.
Upvotes: 21
Views: 30494
Reputation: 1
I had a similar problem but I was able to solve it. Maybe this will help in the future:
This worked for me using springframework and a H2 database:
current_time >= w.lastRun + cast(w.checkIntervalInMin as double)/(24.0*60.0))
I found that explicit casting to double was required when using an integer column for the minutes, otherwise it would automatically round to 0 .
For hardcoded minutes, this should work:
SELECT m FROM Mail m WHERE m.sentAt < current_time - 3.0/(24.0*60.0)
Upvotes: 0
Reputation: 839
If you are using Hibernate JPA implementation and an Oracle dialect, then you can use SYSDATE
function which returns current date and time. If you add 1 to SYSDATE
it will add one day.
Adding fractions is also supported:
sysdate + 1/24
will add an hour sysdate + 1/(24*60)
will add a minute sysdate + 1/(24*60*60)
will add a secondSo instead of :date I need "currentTime minus 3 minutes" as a hard-code literal.
sysdate - 3/(24*60)
will subtract 3 minutes from current date and time:
SELECT m FROM Mail m WHERE m.sentAt < sysdate - 3/(24*60)
Records older than 3 minutes will be returned and no parameter binding is needed.
Upvotes: 5
Reputation: 18379
JPA supports the CURRENT_TIMESTAMP and CURRENT_TIME functions.
https://en.wikibooks.org/wiki/Java_Persistence/JPQL#Functions
The JPA spec does not have date functions, but some JPA providers such as EclipseLink do.
http://java-persistence-performance.blogspot.com/2012/05/jpql-vs-sql-have-both-with-eclipselink.html
JPA 2.1 also defines the FUNCTION operator to call database functions.
In EclipseLink I would try,
SELECT m FROM Mail m WHERE m.sentAt < SQL("(sysdate - interval '3' minute)")
or,
SELECT m FROM Mail m WHERE m.sentAt < SQL("(? - interval '3' minute)", CURRENT_TIMESTAMP)
Upvotes: 5