2012-11-26 21 views
8

में दिनांक संचालन मैं एचक्यूएल का उपयोग कर तालिका से कालबाह्य इकाइयों को प्राप्त करना चाहता हूं। कुछ ऐसा:एचक्यूएल

select id, name from entity_table where date_creation + 10_minutes < current_time() 

मैं एचक्यूएल के साथ ऐसा कैसे कर सकता हूं। मैं जावा कोड में अतिरिक्त प्रश्न, प्रक्रिया तिथि बनाना चाहता हूं। यह एचक्यूएल स्तर पर किया जाना चाहिए।

क्या आप कृपया मेरी मदद कर सकते हैं?

+0

डेटाबेस क्या है? –

उत्तर

10

आपके डेटाबेस के आधार पर, यह मामूली सरल हो सकता है। एचक्यूएल अंतर्निहित विक्रेता-विशिष्ट विशेषताओं और कार्यों का समर्थन करता है, यह नए कार्यों को पंजीकृत करके बोली को विस्तारित करने की क्षमता का भी समर्थन करता है यदि वे पहले ही एचक्यूएल द्वारा समर्थित नहीं हैं।

मान लें कि आप SQLServer (या Sybase) का उपयोग कर रहे हैं। SQLServer में 'DATEADD' नामक एक फ़ंक्शन है जो आपको बहुत आसानी से पसंद कर सकता है। प्रारूप है:

DATEADD (datepart, number, date) 

आप पहली बार अपने दम हाइबरनेट बोली में समारोह पंजीकरण से HQL में सीधे इस सुविधा का उपयोग कर सकते हैं। ऐसा करने के लिए, आपको केवल उस बोलीभाषा को विस्तारित करना होगा जिसका आप वर्तमान में उपयोग कर रहे हैं। यह एक बहुत ही सरल प्रक्रिया है।

सबसे पहले, अपने स्वयं के बोली वर्ग (अपनी खुद की डीबी विक्रेता के साथ 'SQLServer2008Dialect' की जगह ले) बनाने के लिए:

public class MySQLServerDialect extends SQLServer2008Dialect { 

    public MySQLServerDialect() { 
    registerFunction("addminutes", new VarArgsSQLFunction(TimestampType.INSTANCE, "dateadd(minute,", ",", ")")); 
    } 

} 

इसके बाद, इस नए वर्ग का उपयोग करने के अपने हाइबरनेट विन्यास को संशोधित: अब

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
    ... 
    <property name="hibernate.dialect">com.mycompany.MySQLServerDialect</property> 
    ... 
</hibernate-configuration> 

बस फ़ंक्शन का उपयोग करें:

select x from MyEntity x where addminutes(x.creationDate, 10) < current_time() 

(यह मानता है कि आपकी इकाई को MyEntity कहा जाता है और creat_date फ़ील्ड को सृजनडेट नामक किसी संपत्ति पर मैप किया गया है)।

3

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

जब समाधान पूरी तरह से एचक्यूएल में नहीं होना चाहिए और जेवीएम होस्ट से समय पर्याप्त है, तो 10 मिनट पहले की तारीख की गणना करने और इसे तर्क के रूप में देने के लिए पर्याप्त आसान समाधान है। यदि डेटाबेस समय को प्राथमिकता दी जाती है, तो इसे अलग क्वेरी में पूछकर हासिल किया जा सकता है और फिर इससे 10 मिनट कम हो जाता है।