2009-12-04 12 views
8

मुझे यकीन है कि एचक्यूएल से परिचित कोई व्यक्ति (मैं खुद को नौसिखिया हूं) आसानी से इस प्रश्न का उत्तर दे सकता है।जोडा समय के साथ एचक्यूएल (हाइबरनेट) में किसी तारीख की क्वेरी कैसे करें?

मेरे Grails एप्लिकेशन में, मेरे पास निम्न डोमेन क्लास है।

class Book { 
    org.joda.time.DateTime releaseDate //I use the PersistentDateTime for persisting via Hibernate (that use a DATETIME type for MySQL DB) 
} 

मेरी HQL क्वेरी में, मैं पुस्तकें जिनके रिलीज की तारीख रेंज date1 में शामिल है प्राप्त करना चाहते हैं .. date2

उदाहरण के लिए मैंने कोशिश की:

DateTime date1, date2 
... 
def queryStr = "select * from Book as b where b.releaseDate > $date1 and b.releaseDate < $date2" 
def res = Book.executeQuery(queryStr) 

लेकिन मैं अपवाद मिला ...caused by: org.springframework.orm.hibernate3.HibernateQueryException: unexpected token: त्रुटि टोकन दिनांक प्रारूप के लिए इंगित करता है (उदाहरण के लिए 2009-11-27T21:57:18.010+01:00 या Fri Nov 27 22:01:20 CET 2009)

मैंने सफलता के बिना डेट 1 को डेट क्लास में बदलने की कोशिश की है

तो सही एचक्यूएल कोड क्या है? क्या मुझे पैटर्नफॉरटल विधि का उपयोग करके एक विशिष्ट प्रारूप (कौन सा?) में परिवर्तित करना चाहिए या ऐसा करने के लिए कोई अन्य-स्क्वायरर तरीका है?

धन्यवाद,

फैबियन।

+0

org.joda.time.DateTime आपके SQL पर मानचित्र कैसे करता है? क्या यह सीधे मैदान में है? java.util.Date और java.util.Calendar सीधे डेटाबेस फ़ील्ड में मैप कर सकते हैं। इसके लायक होने के लिए, चूंकि डेटटाइम एक समग्र वस्तु है, इसलिए Grails प्लगइन शायद कस्टम मैपिंग प्रकार को कवर के तहत उपयोग कर रहा है (हाइबरनेट के साथ जावा पर्सिस्टेंस के सेक 5.3 देखें)। – Alan

+0

जैसा कि कोड की टिप्पणी में बताया गया है, डेटटाइम जोडा-टाइम-हाइबरनेट लाइब्रेरी – fabien7474

उत्तर

7

मुझे कोई Grails विशेषज्ञ हूँ, लेकिन जावा में आप सामान्य रूप से date1 और date2 क्वेरी पैरामीटर बनाने के लिए और उन्हें इस तरह के रूप बाँध चाहते हैं:

String hql = "select * from Book as b where b.releaseDate > :date1 and b.releaseDate < :date2"; 
session.createQuery(hql).setDate("date1", date1).setDate("date2", date2).list(); 

मैं तुम्हें Grails में इसी तरह कुछ कर सकते हैं यकीन है। यदि नहीं, तो अपनी तिथियों को yyyyMMddhhmmss (कोई रिक्त स्थान) के रूप में प्रारूपित करें और उन्हें एकल उद्धरणों में संलग्न करें - इस तरह हाइबरनेट उन्हें स्थिरांक के रूप में मानेंगे और MySQL उन्हें निश्चित रूप से तिथियों में परिवर्तित कर देगा।

+0

से PersistentDateTime कस्टम मैपिंग प्रकार का उपयोग कर रहा है धन्यवाद बहुत !! आपकी प्रतिक्रिया के बाद, मैं grails स्रोत कोड में गया और एचक्यूएल प्रश्नों को निष्पादित करने के लिए यह पाया: खाता.executeQuery ("खाते से अलग एक। संख्या चुनें जहां एक ए।शाखा =: शाखा ", [शाखा: 'लंदन']) तो मैंने अपने परिदृश्य के लिए ऐसा ही किया और यह काम किया। Thx। – fabien7474

5

मैंने ChssPly द्वारा इंगित किया है, आपको date1 और date2 को क्वेरी पैरामीटर (स्थितित्मक या नामित) के रूप में घोषित करना चाहिए और फिर उन्हें बाध्य करना चाहिए। यहां, हम नामित पैरामीटर का उपयोग करेंगे। Grails के साथ नामित क्वेरी पैरामीटर पारित करने के लिए हमेशा की तरह एक Map के माध्यम से है:

def queryStr = "from Book b where b.releaseDate > :date1 and b.releaseDate < :date2" 
Book.executeQuery(queryStr, [date1: date1, date2: date2]) 

चेक दोनों विकल्पों में से वाक्य रचना जानकारी के लिए executeQuery() प्रलेखन।

+0

हाय पास्कल आपकी सहायता के लिए Thx। मैंने ठीक वही किया जो आपने लिखा है। – fabien7474

3

तुम भी ISO8601 दिनांक स्वरूप, उदा, का उपयोग कर तिथियों की तुलना कर सकते हैं:

select * from Book as b 
where b.releaseDate > '2009-11-27T21:57:18.010+01:00' 
and b.releaseDate < '2010-11-27T21:57:18.010+01:00' 

मैं वापस अंत के रूप में इस MySQL का उपयोग कर परीक्षण किया है। बस स्ट्रिंग के रूप में तारीखों को लपेटना याद रखें।