2013-08-29 15 views
11

JPA sorgusunda geçerli zamana referans veren bir tarih aralığı koşulu koymanın bir yolu var mı (veritabanları arasında uyumludur)?JPA'da "üç dakikadan daha eski" i nasıl sorgularım?

Ben

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

yapabilirsiniz ama bu adlandırılmış sorgu depo parçası ve tarih hesaplama mantığı girmek zorunda değildir olarak yapılandırılabilir, böylece (bir parametre bağlama zorunda kalmadan yapmak istiyorum çağrı kodu).

:date yerine, sabit kod değişmezi olarak "currentTime eksi 3 dakika" gerekir.

+0

Bu soru, JPA'nın kendisinin aritmetiği yapmadığını, ancak belirli uygulamaların olabileceğini akla getirmektedir. Hazırda bekleten bir versiyonu ile iyi olur. http://stackoverflow.com/questions/4105946/jpql-and-date-comparison-constraint-in-the-query?lq=1 – Thilo

cevap

3

JPA, CURRENT_TIMESTAMP ve CURRENT_TIME işlevlerini destekler.

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

JPA Spec

tarih işlevler yok, ancak bu tür EclipseLink gibi bazı JPA sağlayıcıları yapmak.

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

JPA 2.1 de veritabanı işlevleri çağırmak için FONKSİYON operatörü tanımlar.

EclipseLink yılında

ben denemek istiyorum,

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

ya,

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

Çift tırnak işaretleri doğru değil ve tek tırnak işareti ile değiştirilmelidir. – tak3shi

1

Eğer hazırda JPA uygulama ve bir Oracle lehçesini kullanıyorsanız, o zaman döndüren SYSDATE işlevini kullanabilirsiniz geçerli tarih ve saat. 1 ila SYSDATE eklerseniz, bir gün ekleyecektir.

ekleme fraksiyonlar da desteklenir:

  • sysdate + 1/24
  • sysdate + 1/(24*60*60) ikinci

eklemek Yani yerine edecek bir dakikadan katacak bir saat

  • sysdate + 1/(24*60) katacak: tarih Bir hard-code literal olarak "currentTime eksi 3 dakika" ihtiyacım var.
  • sysdate - 3/(24*60)

    geçerli tarih ve saat 3 dakika düşeriz: iade edilecektir 3 dakikadan daha

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

    Kayıtlar yaşlı ve hiçbir parametre gereklidir bağlandığı görülmüştür.

    +1

    Sadece ORACLE lehçesi veya MYSql için de çalışır mı? –

    İlgili konular