2011-09-23 11 views
9

मैं एक डोमेन वस्तु (बिल्ली) है इस तरह:Grails/hasmany स्ट्रिंग के साथ GORM मापदंड क्वेरी

class Cat { 
    String name 

    static hasMany = [ 
     nicknames: String 
    ] 
} 

(एक बिल्ली एक नाम है, और भी कई उपनाम हैं (जो तार कर रहे हैं))

और मैं कुछ प्रचलित नामों के साथ सभी बिल्लियों से पूछताछ करने की कोशिश कर रहा हूं।

मैं इस की कोशिश की है:

PagedResultList getCatsByNickname(String nickname, Map params) { 
    PagedResultList results = Cat.createCriteria().list(params) { 
     'ilike'('nicknames','%'+nickname+'%') 
    } 
    return results 
} 

लेकिन यह किसी भी परिणाम देता है कभी नहीं। इस (अगर मैं क्वेरी को बदलने सिर्फ सरल नाम विशेषता का उपयोग करने के लिए, यह है कि नाम के साथ सभी बिल्लियों खोजने से काम करता है, लेकिन मैं उपनाम के खिलाफ क्वेरी करना चाहते हैं।)

मैं भी करने की कोशिश की:

PagedResultList getCatsByNickname(String nickname, Map params) { 
    PagedResultList results = Cat.createCriteria().list(params) { 
     'nicknames' { 
     'ilike'('nicknames','%'+nickname+'%') 
     } 
    } 
    return results 
} 

लेकिन मुझे त्रुटि मिलती है: org.hibernate.MappingException: संग्रह एक एसोसिएशन नहीं था: example.Cat.nicknames

तो सवाल यह है कि मैं किसी प्रकार के स्ट्रिंग के खिलाफ कैसे पूछूं?

+1

कुछ लोगों को एक ही सवाल पूछने: http://grails.1312388.n4.nabble.com/Criteria -query-on-Properties-of-type-list-lt-String-gt-td1325707.html http://grails.1312388.n4.nabble.com/GORM-how-to-set-criteria-for-object -with-list-or-set-of-strings-td1388277.html – McDave

+0

यह बग आपको मिलने वाली त्रुटि का कारण प्रतीत होता है: [GRAILS-5887] (https://jira.grails.org/browse/GRAILS -5887) – cweston

उत्तर

7

आप ऐसे परिदृश्य में पूछताछ के लिए एचक्यूएल का उपयोग कर सकते हैं। उदाहरण के लिए,

Cat.findAll("from Cat c where :nicknames in elements(c.nicknames)", [nicknames:'kitty']) 
+0

आपकी प्रतिक्रिया के लिए धन्यवाद! ठीक है, यह मुझे शुरू कर देता है, लेकिन मैं कैसे कहूं कि मुझे उपनाम ** ** ** किट्टी चाहिए? – McDave

+0

मुझे लगता है कि findAll PostgreSQL वाक्यविन्यास का उपयोग करता है, इसलिए% kitty% – bitbucket

+0

% kitty% काम नहीं करता है। मैं mysql पर इस कोशिश की और हाइबरनेट एक एसक्यूएल कि लग रहा है उत्पन्न करता है "का चयन करें * बिल्ली ग जहां में 'किटी' से ( से cat_nicknames n nicknames_string का चयन करें जहां c.id = n.cat_id )" .... दुर्भाग्य से ऐसा लगता है कि आपको एक या खंड (% kitty% जैसे उपनाम 'या'% timmy% 'जैसे उपनाम का उपयोग करने की आवश्यकता होगी ...) – aldrin

9

की कोशिश कर रहा है और शोध का एक बहुत बाद, मैंने पाया यह Grails 2.4.0 के साथ काम करेंगे, मैं पुराने संस्करणों के बारे में पता नहीं है।

Cat.withCriteria { 
    createAlias('nicknames', 'n') 
    ilike 'n.elements', '%kitty%' 
} 

चाल 'एन' का उपयोग करना है। तत्वों '

+1

मुझे अभी भी "org.hibernate.MappingException: संग्रह एक एसोसिएशन नहीं था" 2.4.0 – cweston

+1

में इस विधि का उपयोग करते समय यह मेरे लिए काम करता था और मुझे लगता है कि यह Grails दस्तावेज़ में कहीं भी दस्तावेज नहीं है। धन्यवाद। –

+1

यह मेरे लिए काम करता है और मुझे इसके बारे में कोई दस्तावेज नहीं मिल रहा है – Samuel

0

तुम भी HQL का उपयोग कर सकते (Grails 2.5.0 के साथ परीक्षण):

Cat.findAll("from Cat c inner join c.nicknames as n where upper(n) like '%'||?||'%'", [nickname.toUpperCase()]) 
संबंधित मुद्दे