有沒有辦法在JPA查詢中引用當前時間的日期範圍條件(即跨數據庫兼容)?如何在JPA中查詢「三分鐘以上」?
我可以做
SELECT m FROM Mail m WHERE m.sentAt < :date
,但我想這樣做,而不必綁定參數(如此,這可以被配置爲命名查詢庫中的一部分,而日期計算邏輯沒有進入調用代碼)。
因此,我不需要:date
作爲硬編碼文字「currentTime減3分鐘」。
有沒有辦法在JPA查詢中引用當前時間的日期範圍條件(即跨數據庫兼容)?如何在JPA中查詢「三分鐘以上」?
我可以做
SELECT m FROM Mail m WHERE m.sentAt < :date
,但我想這樣做,而不必綁定參數(如此,這可以被配置爲命名查詢庫中的一部分,而日期計算邏輯沒有進入調用代碼)。
因此,我不需要:date
作爲硬編碼文字「currentTime減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)
雙引號不正確,必須用單引號替換。 – tak3shi
如果您正在使用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分鐘將返回舊的和不需要的參數綁定。
它只適用於ORACLE方言或MYSQL嗎? –
這個相關的問題似乎表明,JPA本身不做日期算術,但具體的實現可能。我會好的一個休眠版本。 http://stackoverflow.com/questions/4105946/jpql-and-date-comparison-constraint-in-the-query?lq=1 – Thilo