आप केवल एक 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
एसोसिएशन को भी इनिशियलाइज़ किया जाएगा।