-
select d from TKBData d JOIN d.columns c WHERE c.name = column1
है- एक TKBData ऑब्जेक्ट ढूंढें जहां उसका एक संबद्ध
column
है वह वस्तु जिसके लिएname
column1
है - एक बार यह तय हो जाने के बाद कि किस TKBData में कम से कम एक
column
है वह वस्तु जिसके लिएname
column1
है , फिर यह अपने सभी संबद्धcolumn
. को वापस कर देगा वस्तुएं जिस पर आपका जेपीए में नियंत्रण नहीं है। (देखें एक अन्य प्रश्न का मेरा उत्तर ) वैकल्पिक है देशी sql लिखना और कस्टम गैर-इकाई वस्तुओं को वापस करना - उदाहरण के लिए, आपके पास
TKBDATA_1
हैcolumn1
. के साथ औरcolumn2
संबद्ध, आपके पासTKBDATA_2
भी हैcolumn3
. के साथ संबद्ध। - जब आप अपनी क्वेरी चलाते हैं, तो यह
TKBDATA_2
. को अनदेखा कर देगी औरTKBDATA_1
return लौटाने का निर्णय लेता है क्योंकि इसमें कम से कम एकcolumn
हैname
के साथ वस्तु =column2
. लेकिन उसके बाद आपके पास इस पर नियंत्रण नहीं है कि कौन से संबंधितcolumn
TKBDATA_1
. के लिए वापस आने वाली वस्तुएं और जेपीए सभी संबद्ध कॉलम ऑब्जेक्ट लौटाएगा - यदि आप कारण के बारे में सुनिश्चित नहीं हैं, तो हाइबरनेट सत्र के बारे में पढ़ें। यह स्मृति में किसी भी संबद्ध प्रविष्टि की अनूठी प्रस्तुति कैसे प्रदान करता है। यह इसकी
dirty checking
. का आधार है औरrepeatable read
- एक TKBData ऑब्जेक्ट ढूंढें जहां उसका एक संबद्ध
-
अपना
@OneToMany
अपडेट करें इस प्रकार है
@OneToMany(fetch = FetchType.EAGER,
cascade = CascadeType.ALL, orphanRemoval = true)
@Builder.Default
@JoinTable(name = "TKBDATA_TKBCOLUMN",
joinColumns = @JoinColumn(name = "TKBDATA_ID"),
inverseJoinColumns = @JoinColumn(name = "COLUMNS_ID"))
private Set<TKBColumn> columns = Sets.newHashSet();
-
जब जेपीए क्वेरी भाषा की बात आती है, तो मैं क्वेरी के संदर्भ में इन-मेमोरी ऑब्जेक्ट्स के संग्रह के बारे में सोचना चाहूंगा।
-
तो अब वस्तुओं के संदर्भ में निम्नलिखित दो प्रश्नों के अर्थ का वर्णन करने का प्रयास करें।
select d from TKBData d LEFT JOIN d.columns c WHERE c.name = :name
vs
select d from TKBData d JOIN d.columns c WHERE c.name = :name
-
एसक्यूएल के विपरीत मत भूलना जहां आप यहां किसी भी कॉलम का चयन कर रहे हैं, आपने कहा है कि आप टीकेबीडाटा ऑब्जेक्ट्स का चयन करना चाहते हैं और टीकेबीडेटा ऑब्जेक्ट्स को वापस करने के लिए प्रतिबंधित करना चाहते हैं।
-
तो अपने मूल sql के समान परिणाम प्राप्त करने के लिए, दूसरी JPA क्वेरी का उपयोग करें
नोट:
भले ही आपने अपनी sql क्वेरी में लेफ्ट जॉइन का उपयोग किया हो, यह प्रभावी रूप से एक इनर जॉइन sql क्वेरी है क्योंकि आपने where
भी लागू किया है उस जॉइन पर सबसे दाहिनी तालिका की स्थिति।