2009-03-12 7 views
16

मैं देख रहा हूं कि एक एचक्यूएल क्वेरी के भीतर दिनांक/समय गणित कैसे करें। विशेष रूप से, current_timestamp() फ़ंक्शन के परिणाम से मैं समय (x) कितनी बार जोड़ या घटा सकता हूं? या क्या मुझे इसके लिए एसक्यूएल में ड्रॉप करना है और उम्मीद है कि जो भी डेटाबेस चलाया जा रहा है, उसका समर्थन करता है?एचक्यूएल में दिनांक/समय गणित प्रदर्शन?

HQL क्वेरी उदाहरण: किसी विशेष इकाई होने के लिए, हालांकि कुछ भी घंटे से भी बड़ा अवांछनीय होगा timeToSubtract पैरामीटर, और सेकंड सबसे वांछनीय होगा:

FROM RandomThing 
WHERE randomTime IS NOT NULL AND 
     randomTime >= current_timestamp() AND 
     randomTime <= (current_timestamp() + :timeToAdd) 

मैं परिभाषित कर सकते हैं।

वर्गीकरण: मुझे एहसास है कि यह आसानी से क्वेरी के बाहर किया जा सकता है। लेकिन दार्शनिक कारणों से, मान लें कि क्वेरीिंग सिस्टम के समय के बजाय डेटाबेस सर्वर के समय का उपयोग करना महत्वपूर्ण है। व्यावहारिक उदाहरण: मैं अंतिम (x) समय के भीतर किए गए सभी प्रविष्टियों के लिए स्वचालित टाइमस्टैम्प से पूछताछ कर रहा हूं। चूंकि टाइमस्टैम्प डेटाबेस सिस्टम द्वारा किया जाता है, इसलिए डेटाबेस के वर्तमान समय का भी उपयोग करना महत्वपूर्ण है।

+0

मैं भी वही चीज़ ढूंढ रहा हूं, सिवाय इसके कि टाइमऑड एक पैरामीटर नहीं है, लेकिन एक ही पंक्ति से एक कॉलम है, इसलिए एक ही पंक्ति और तालिका में दूसरी क्वेरी बनाने के लिए यह समझ में नहीं आता है। – James

उत्तर

3

आप डेटाबेस सर्वर के समय की आवश्यकता है, तो आपको पहले एक सरल HQL क्वेरी टाइमस्टैम्प और फिर जावा में maxTimestamp की गणना करने और पारित करने के लिए प्राप्त किए गए कर सकता है: मैं शायद एक हाइबरनेट मानदंड और उपयोग करने के लिए स्विच होगा टाइमस्टैम्प और गणना की गई अधिकतम टाइमस्टैम्प सीसीसीएल की तरह एक क्वेरी के लिए।

+0

मुझे लगता है कि यह सबसे सामान्य और आसान कार्यान्वयन समाधान है। धन्यवाद। – jdmichal

10

आपको क्वेरी में ऐसा करने की आवश्यकता क्यों है? इसे जावा कोड में क्यों न रखें।

उदाहरण के लिए

:

From RandomThing 
Where randomTime is not null and 
     randomTime >= :currentTimestamp and 
     randomTime <= :maxTimestamp 

और फिर बस पैरामीटर सेट।

+0

अच्छा जवाब। मैंने अपनी प्रतिक्रिया के साथ प्रश्न में स्पष्टीकरण दिए। – jdmichal

+2

क्योंकि जावा कोड एक ही घड़ी पर नहीं चल रहा है, और कुछ प्रश्नों में, कुछ सेकंड अंतर भी परेशानी का कारण बन सकता है। – Quartz

4

आप अपने डेटाबेस में एसक्यूएल का उपयोग करके इसे करने के लिए वाक्यविन्यास निर्धारित कर सकते हैं और फिर एक कस्टम HibernateDialect के भीतर एक फ़ंक्शन को परिभाषित कर सकते हैं। उदाहरण के लिए, हमें एक सप्ताह के फ़ंक्शन की आवश्यकता होती है जो मानक एसक्यूएल नहीं है। हम प्रत्येक डेटाबेस के लिए बोली subclassed और फिर इस तरह की एक पंक्ति कहा:

registerFunction("weekday", 
    new SQLFunctionTemplate(Hibernate.INTEGER, "to_char(?1,'D')")); 

आपके मामले में, आप एक समारोह date_diff जो के रूप में परिभाषित किया जा सकता है कहा जाता है इस्तेमाल कर सकते हैं? -? कुछ डेटाबेस में या दूसरों में कुछ अलग है। इस तरह आपको अपनी क्वेरी में कच्चे एसक्यूएल लिखने की ज़रूरत नहीं है और यदि आपको कभी भी डेटाबेस स्विच करने की आवश्यकता है, तो आप बस अपनी बोली में फ़ंक्शन को अलग-अलग मैप करें।

1

क्या यह एचक्यूएल होना चाहिए?

Criteria.add(Restrictions.SQLRestriction("{alias} <= current_timestamp() ")) 
Criteria.add(Restrictions.SQLRestriction("{alias} >= (current_timestamp() + ?) ", 5) 
+1

उन दो कथनों को मानदंडों में बनाम एक एचक्यूएल क्वेरी में डालने के बीच क्या अंतर है? – jdmichal

+0

यह समाधान CriteriaQuery API के साथ काम करता है, जो उपयोगी है अगर कोई पहले से ही उस दृष्टिकोण का पालन कर रहा है। –