2013-08-29 3 views
11

क्या एक जेपीए क्वेरी (जो डेटाबेस में संगत है) में वर्तमान समय का संदर्भ देने की तिथि सीमा स्थिति डालने का कोई तरीका है?मैं जेपीए में "तीन मिनट से अधिक पुराना" कैसे पूछूं?

मैं

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

कर सकते हैं, लेकिन मैं एक पैरामीटर बाध्य करने के लिए (ताकि इस नाम क्वेरी भंडार का हिस्सा है और तिथि गणना के तर्क में प्रवेश करने की जरूरत नहीं है के रूप में विन्यस्त किया जा सकता बिना इसे क्या करना चाहते हैं कॉलिंग कोड)।

तो :date के बजाय मुझे हार्ड-कोड शाब्दिक के रूप में "वर्तमान समय शून्य 3 मिनट" की आवश्यकता है।

+0

यह संबंधित प्रश्न यह सुझाव देता है कि जेपीए स्वयं अंकगणित नहीं करता है, लेकिन विशिष्ट कार्यान्वयन हो सकता है। मैं एक हाइबरनेट संस्करण के साथ ठीक हूँ। http://stackoverflow.com/questions/4105946/jpql-and-date-comparison-constraint-in-the-query?lq=1 – Thilo

उत्तर

3

जेपीए CURRENT_TIMESTAMP और CURRENT_TIME फ़ंक्शंस का समर्थन करता है।

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

जेपीए कल्पना तारीख फ़ंक्शन नहीं है, लेकिन इस तरह के रूप में कुछ EclipseLink जेपीए प्रदाताओं से करते हैं।

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

जेपीए 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

आप हाइबरनेट जेपीए कार्यान्वयन और एक ओरेकल बोली का उपयोग कर रहे हैं, तो आप SYSDATE समारोह जो रिटर्न उपयोग कर सकते हैं वर्तमान तिथि और समय। यदि आप 1 से SYSDATE जोड़ते हैं तो यह एक दिन जोड़ देगा।

जोड़ना अंशों भी समर्थित है:

  • sysdate + 1/24 एक घंटे
  • sysdate + 1/(24*60) जोड़ देगा एक मिनट
  • sysdate + 1/(24*60*60) एक दूसरे

जोड़ने तो बजाय जाएगा जोड़ देगा: तिथि मुझे हार्ड-कोड शाब्दिक के रूप में "वर्तमान समय शून्य 3 मिनट" की आवश्यकता है।

sysdate - 3/(24*60) वर्तमान दिनांक और समय से 3 मिनट घटा देंगे:

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

रिकॉर्ड्स 3 मिनट लौटा दी जाएगी से अधिक उम्र के और कोई पैरामीटर बंधन की जरूरत है।

+1

क्या यह केवल ओरेकल बोली या MYSQL के लिए भी काम करेगा? –

संबंधित मुद्दे