2013-08-29 10 views
11

C'è un modo per inserire una condizione di intervallo di date che fa riferimento all'ora corrente in una query JPA (che è compatibile tra database)?Come faccio a interrogare "più vecchi di tre minuti" in JPA?

posso fare

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

ma voglio farlo senza dover associare un parametro (in modo che questo può essere configurato come parte del repository query denominata e la logica data di calcolo non deve entrare il codice chiamante).

Quindi invece di :date ho bisogno di "currentTime meno 3 minuti" come letterale di hard-code.

+0

Questa domanda correlata sembra suggerire che lo stesso JPA non fa data aritmetica, ma potrebbero essere implementazioni specifiche. Sarei a posto con una versione di Hibernate. http://stackoverflow.com/questions/4105946/jpql-and-date-comparison-constraint-in-the-query?lq=1 – Thilo

risposta

3

JPA supporta le funzioni CURRENT_TIMESTAMP e CURRENT_TIME.

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

Le specifiche APP non ha funzioni di data, ma alcuni provider JPA, come EclipseLink fanno.

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

JPA 2.1 definisce inoltre all'operatore FUNCTION per chiamare funzioni di database.

In EclipseLink vorrei provare,

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

o,

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

Le virgolette doppie non sono corrette e devono essere sostituite con virgolette singole. – tak3shi

1

Se si utilizza Hibernate JPA implementazione e un Oracle dialetto, quindi è possibile utilizzare SYSDATE funzione che restituisce data e ora correnti. Se aggiungi 1 a SYSDATE, verrà aggiunto un giorno.

frazioni Aggiunta è anche supportato:

  • sysdate + 1/24 aggiungerà un'ora
  • sysdate + 1/(24*60) aggiungerà un minuto
  • sysdate + 1/(24*60*60) aggiungerà una seconda

Così, invece di: data Ho bisogno di "currentTime meno 3 minuti" come un vero hard-code.

sysdate - 3/(24*60) sottrarrà a 3 minuti dalla data e ora correnti:

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

Records di età superiore ai 3 minuti sarà restituito e non vincolante parametro è necessario.

+1

Funzionerà solo per ORACLE dialect o MYSql anche? –

Problemi correlati