2013-02-07 52 views
5

मैंने एक Grails सेवा कक्षा में एक मानदंड क्वेरी लिखी है जहां मैं एक उत्सुकता में शामिल होने की उम्मीद करता हूं, और मेरे परिणामों को जेएसओएन प्रतिक्रिया या मेरे रूप में प्रदर्शित करते समय बाल वस्तुओं की आलसी लोडिंग से बचने के लिए जीएसपी। क्वेरी अपेक्षित के रूप में निष्पादित की गई है (मेरे डेटासॉर्स.groovy में मेरा hibernate.show_sql = true सेट करना मैं क्वेरी देख सकता हूं), लेकिन जब मैं अपने जीएसपी में एसोसिएशन क्रॉल करता हूं, तो मैं देख सकता हूं कि हाइबरनेट बाद के प्रश्नों को निष्पादित कर रहा है जैसे कि यह आलसी लोड हो रहा था संघ मुझे विश्वास नहीं है कि उत्सुक लोडिंग वास्तव में काम कर रही है। मैं आलसी सेट नहीं करना चाहता: इन एसोसिएशन के लिए मेरे डोमेन क्लास में झूठा।Grails GORM मानदंड प्रश्न उत्सुक Fetging

def market = Market.withCriteria(uniqueResult:true){ 
    idEq(marketId) 
    fetchMode 'resourceAssignments', FetchMode.JOIN 
    fetchMode 'resourceAssignments.userRole', FetchMode.JOIN 
    fetchMode 'resourceAssignments.userRole.role', FetchMode.JOIN 
    fetchMode 'resourceAssignments.userRole.user', FetchMode.JOIN 
    resourceAssignments{ 
     userRole{ 
      role{ 
       'in'('name', roleNames) 
      } 
     } 
    }   
} 

बिना किसी समस्या के ऊपर क्वेरी:

इस मापदंड क्वेरी है। जब मैं अपने जीएसपी में निम्न कोड को चलाने के लिए हालांकि प्रयास करते हैं, मैं देख सकता हूँ कि हाइबरनेट जैसे कि वह lazily resourceAssignments प्राप्त करते समय कर रहे थे एक दूसरे क्वेरी जारी करने जाता है:

<g:each in="${market.resourceAssignments}" var="ra"> 
</g:each> 

मैं भी साथ एक नहीं OpenSessionInViewInterceptor अधिभावी की कोशिश की - ओपी इंटरसेप्टर, एक खाली WebRequestInterceptor बनाकर और resource.groovy में openSessionInViewInterceptor को सेट करने के लिए इसका उपयोग करने के लिए। एक बार मैंने ऐसा करने के बाद, मुझे एक org.hibernate.LazyInitializationException मिलता है जो मैं सोच रहा था कि यह सत्यापित करने के लिए प्रतीत होता है - कि हाइबरनेट या GORM अभी भी एक दूसरी क्वेरी निष्पादित करने का प्रयास कर रहा है, भले ही मैंने यह निर्दिष्ट किया है कि मैं उत्सुकता से इन संगठनों को प्राप्त करना चाहता हूं।

उत्तर

5

यह मानदंड प्रश्नों के साथ एक Grails बग प्रतीत होता है। यहां एक एचक्यूएल क्वेरी है जो यद्यपि काम करती है:

def market = Market.executeQuery(
    'select m from Market m ' + 
    'inner join fetch m.resourceAssignments as ra ' + 
    'inner join fetch ra.userRole as ur ' + 
    'inner join fetch ur.role as role ' + 
    'inner join fetch ur.user as user ' + 
    'where m.id=:marketId and role.name in (:roleNames)', 
    [marketId: marketId, roleNames: roleNames], [max: 1])[0] 
+1

धन्यवाद बर्ट। बग ठीक होने तक हम एचक्यूएल का उपयोग करेंगे। बॉबी वार्नर ने रुचि रखने वालों के लिए इस मुद्दे के लिए जिरा में एक बग प्रस्तुत किया: http://jira.grails.org/browse/GRAILS-9829 –

+0

@ डेविडमालोन द्वारा उल्लिखित जेआईआरए मुद्दे को गिटहब में माइग्रेट किया गया है https://github.com/ grails/grails कोर/मुद्दों/2764 –