आप केवल एक EntityGraph
यदि संघ विशेषता सुपरक्लास का हिस्सा है और उसके द्वारा भी सभी उपवर्गों का हिस्सा है। अन्यथा, EntityGraph Exception के साथ हमेशा विफल रहेगा जो आपको वर्तमान में मिलता है।
अपनी N+1 चयन समस्या से बचने का सबसे अच्छा तरीका है कि आप अपनी क्वेरी को 2 प्रश्नों में विभाजित करें:
पहली क्वेरी MCValue प्राप्त करती है EntityGraph का उपयोग करने वाली इकाइयां selected . द्वारा मैप किए गए एसोसिएशन को लाने के लिए विशेषता। उस क्वेरी के बाद, इन संस्थाओं को हाइबरनेट के प्रथम स्तर कैश/दृढ़ता संदर्भ में संग्रहीत किया जाता है। दूसरी क्वेरी के परिणाम को संसाधित करते समय हाइबरनेट उनका उपयोग करेगा।
@Query("SELECT m FROM MCValue m") // add WHERE clause as needed ...
@EntityGraph(attributePaths = {"selected"})
public List<MCValue> findAll();
दूसरी क्वेरी तब Answer प्राप्त करती है इकाई और एक EntityGraph . का उपयोग करता है संबंधित Value को भी लाने के लिए संस्थाएं। प्रत्येक Value के लिए इकाई, हाइबरनेट विशिष्ट उपवर्ग को तुरंत चालू करेगा और जांच करेगा कि क्या पहले स्तर के कैश में पहले से ही उस वर्ग और प्राथमिक कुंजी संयोजन के लिए कोई वस्तु है। यदि ऐसा है, तो हाइबरनेट क्वेरी द्वारा लौटाए गए डेटा के बजाय पहले स्तर के कैश से ऑब्जेक्ट का उपयोग करता है।
@Query("SELECT a FROM Answer a")
@EntityGraph(attributePaths = {"value"})
public List<Answer> findAll();
क्योंकि हम पहले ही सभी MCValue प्राप्त कर चुके हैं संबंधित selected वाली इकाइयां संस्थाओं, अब हमें Answer मिलता है आरंभिक Value with के साथ इकाइयाँ संगठन। और अगर एसोसिएशन में एक MCValue शामिल है इकाई, इसका selected एसोसिएशन को भी इनिशियलाइज़ किया जाएगा।