2011-12-27 10 views
6

मैं यह जानने की कोशिश कर रहा हूं कि Grails में बाएं के बजाय पूर्ण रिकॉर्ड लाने के लिए उत्सुकता है या नहीं।क्या Grails में पूरा रिकॉर्ड लाने के लिए उत्सुकता है?

मेरे पास दो कक्षाएं हैं जिनमें से कई मैपिंग हैं। जब मैं सभी रिकॉर्ड्स प्राप्त करने और एक्सएमएल के रूप में प्रस्तुत करने का प्रयास करता हूं, तो केवल "कई" पक्ष की आईडी एक्सएमएल फ़ाइल में आती हैं। क्या पूरे रिकॉर्ड प्राप्त करने के लिए वैसे भी है?

उदाहरण है कि मैं उपयोग कर रहा हूँ

निम्नलिखित है:

मैं 3 वर्गों है:

उपयोगकर्ता, पुस्तक और अध्याय

उपयोगकर्ता और बुक कई मानचित्रण और अध्याय को बुक करने के लिए एक बहुत है कई मैपिंग के लिए एक। मेरे पास एक क्लास यूज़रबुक है जो कई लोगों को कई रिश्तों को परिभाषित करता है। अब मेरे पास निम्नलिखित कोड

user = User.findByUserId(params.userid.toString()) 
     def books = user.getAllBooks() 
     render books as XML 

Set<Book>getAllBooks() { 
     UserBook.findAllByUser(this).collect {it.book} as Set 
    } 

उपर्युक्त पुस्तकों के साथ एक एक्सएमएल प्रस्तुत करता है और प्रत्येक पुस्तक के लिए अध्याय आईडी भी प्रस्तुत करता है। मैं जो चाहता था वह "किताबें" उपरोक्त सभी अध्याय जानकारी भी शामिल थी।

धन्यवाद !!

+0

सका आप अपने वर्गों का एक उदाहरण प्रदान करते हैं ताकि हम आपके प्रश्न का बेहतर उत्तर दे सकें? –

+0

माइकल, मैंने आपके द्वारा सुझाए गए उदाहरण प्रदान किए हैं। धन्यवाद!! – iKT

उत्तर

2

docs section 5.3.4 देखें। यह आप डोमेन कक्षा में fetchMode का उपयोग किया जाता है:

static fetchMode = [things:"eager"] 

हालांकि, अपने एक XML फ़ाइल (या किसी अन्य क्षेत्र) को भरने के लिए मैं बेहतर प्रदर्शन के लिए projection criteria की जाँच करेगा सिर्फ आईडी एक वस्तु की की तलाश में है, तो पर बड़े संग्रह

10

डॉक्स का कहना है:

डिफ़ॉल्ट लाने Grails द्वारा इस्तेमाल किया रणनीति, "सुस्त" है जिसका मतलब है कि संग्रह lazily प्रारंभ कर दिया जाएगा। यदि आप सावधान नहीं हैं तो इससे एन + 1 समस्या हो सकती है। आप की जरूरत है "उत्सुक" प्राप्त करने में कठिनाई यदि आप ORM डीएसएल उपयोग कर सकते हैं या एक प्रश्न के भाग के रूप प्राप्त करने में कठिनाई उत्सुक निर्दिष्ट

आप डोमेन कक्षा में रणनीति लाने निर्दिष्ट कर सकते हैं, लेकिन IMHO, सबसे अच्छी रणनीति एक 1 प्राप्त करने के लिए

// You have a Book with many Authors, then you specify the fetching strategy with eager 
def results = Book.list(fetch:[authors:"eager"]) 

अन्य मामले आप हाइबरनेट साथ मापदंड का उपयोग कर सकते लायें मोड में: -m संबंध लाने या डोमेन कक्षा या मानदंड को जोड़ा गया विधियों के माध्यम से क्वेरी में शामिल होने के साथ, उदाहरण के लिए है

import org.hibernate.FetchMode as FM 
… 
def results = c.list { 
    maxResults(10) 
    firstResult(50) 
    fetchMode("aRelationship", FM.JOIN) 
} 

या बेहतर यदि आप एचक्यूएल को जानते हैं, तो आप इसका उपयोग कर सकते हैं, क्योंकि एचक्यूएल में लाने का संकेत देना संभव है, उदाहरण के लिए: def परिणाम = DomainClass.findAll ("HQL_Sentence")

कूल ओह !!!!

5

आप XML आउटपुट केवल आईडी के बजाय पूरा अध्याय जानकारी रखने के लिए, 'गहरे' एक्सएमएल वास्ते का उपयोग करके देखें लिए देख रहे हैं (, JSON के लिए एक ही काम करता है भी):

XML.use('deep') { 
    render books as XML 
} 
संबंधित मुद्दे