Grails

2012-01-10 18 views
13

मैं इस तरह कोड है एक डोमेन वर्ग के सभी आईडी पुनरावृत्ति करने के लिए सबसे अच्छा तरीका है:Grails

Book.list().each { 
    // real code actually does something more useful 
    println "My id is " + it.id 
} 

यह मेरे बर्बादी का एक सा है कि प्रत्येक पुस्तक के संपूर्ण वस्तु बस का उपयोग करने के लोड किया जा रहा है के रूप में हमलों आईडी। Grails में एक लोड() विधि है जब आप केवल आईडी पर काम करना चाहते हैं और मैं सोच रहा हूं कि क्या सभी डोमेन उदाहरण लोड करने के लिए समकक्ष है? क्या मुझे एचक्यूएल का उपयोग करना चाहिए? या क्या मुझे इसे छोड़ देना चाहिए?

पुनश्च: यह मुझे आश्चर्य है कि क्या एक विकल्प सबसे GORM विधियों (ढूँढ़ने आदि) जो बजाय केवल "लोड" करने के लिए इसे पैदा करने के लिए उपलब्ध होना चाहिए बनाता है

उत्तर

8

आप HQL का उपयोग कर सकते सिर्फ खेतों वापस जाने के लिए आप संयोजन में

Book.executeQuery("select b.id from Book b");

+0

मैं कहूंगा कि 'nameQueries' या मानदंड प्रश्नों का उपयोग करना पठनीयता के लिए एसक्यूएल से काफी बेहतर है, खासकर जब आपके प्रश्न अधिक जटिल हो जाते हैं। –

-2

"मिल" लक्ष्य वर्ग जब तक बुक वस्तु शामिल बहुत सारे डेटा, मैं इसे सरल रखने के लिए बस बुक.लिस्ट के साथ जाऊंगा।

याद रखें कि लोड() वास्तव में डेटाबेस को हिट नहीं करता है, यह सिर्फ आईडी सेट के साथ एक ऑब्जेक्ट बनाता है।

+0

मैंने अभी लोड करने की कोशिश की है और यदि आप आईडी के अलावा किसी अन्य संपत्ति तक पहुंचने का प्रयास करते हैं तो यह डेटाबेस को मार रहा है। – aldrin

+0

हां, यही कारण है कि केवल नई पुस्तक (आईडी: 2) के बजाय .load का उपयोग करने का कारण है, यह एक प्रॉक्सी ऑब्जेक्ट बनाता है जो ऑब्जेक्ट को एक्सेस पर ऑब्जेक्ट लोड करता है। –

+0

मैं इस बात से सहमत हूं कि यदि बुक क्लास में बहुत सारे डेटा नहीं हैं (100k से कम) Book.list() का उपयोग करना शायद ठीक है। –

9

एक मापदंड क्वेरी की जरूरत है एक प्रक्षेपण के साथ अपनी समस्या का हल है जब आप HQL का उपयोग कर से बचने के लिए चाहते हैं।

def criteria = Book.createCriteria() 
    def result = criteria.list { 
     projections { 
      property 'id' 
     } 
    } 

हाइबरनेट एसक्यूएल प्रवेश से पता चलता है कि केवल आईडी डेटाबेस से लोड किए गए हैं, और नहीं पूरे पुस्तकें: select this_.id as y0_ from book this_

मानदंड क्वेरी को पुस्तक डोमेन वर्ग पर named query के रूप में भी जोड़ा जा सकता है, जो आईडी की सूची तक आसान पहुंच प्रदान करता है।

5

+1 के लिए @ रूबेन के जवाब है, लेकिन आप बस

def criteria = Book.withCriteria { 
    projections { 
     property 'id' 
    } 
} 

को इसे छोटा करें और एक ही परिणाम प्राप्त कर सकते हैं!