2013-08-29 20 views
11

有沒有辦法在JPA查詢中引用當前時間的日期範圍條件(即跨數據庫兼容)?如何在JPA中查詢「三分鐘以上」?

我可以做

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

,但我想這樣做,而不必綁定參數(如此,這可以被配置爲命名查詢庫中的一部分,而日期計算邏輯沒有進入調用代碼)。

因此,我不需要:date作爲硬編碼文字「currentTime減3分鐘」。

+0

這個相關的問題似乎表明,JPA本身不做日期算術,但具體的實現可能。我會好的一個休眠版本。 http://stackoverflow.com/questions/4105946/jpql-and-date-comparison-constraint-in-the-query?lq=1 – Thilo

回答

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還定義了函數運算符來調用數據庫功能。

在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) 
+0

雙引號不正確,必須用單引號替換。 – tak3shi

1

如果您正在使用Hibernate的JPA實施和甲骨文話,那麼你可以使用SYSDATE函數返回當前日期和時間。如果將1加到SYSDATE它將會增加一天。還支持

添加分數:

  • sysdate + 1/24將增加一個小時
  • sysdate + 1/(24*60)將增加一分鐘
  • sysdate + 1/(24*60*60)會加入第二

所以不是:日期我需要「currentTime減去3分鐘」作爲硬編碼文字。

sysdate - 3/(24*60)將減去當前的日期和時間3分鐘:

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

記錄超過3分鐘將返回舊的和不需要的參數綁定。

+1

它只適用於ORACLE方言或MYSQL嗎? –