2011-07-02 3 views
6

एक सुपर-क्लास के लिए, मैं एक हाइबरनेट मानदंड क्वेरी कैसे लिख सकता हूं, और एक निश्चित उप-वर्ग की जांच कर सकता हूं?एक सुपर-क्लास के लिए, मैं एक हाइबरनेट मानदंड क्वेरी कैसे लिख सकता हूं, और एक निश्चित उप-वर्ग की जांच कर सकता हूं?

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
public class Bar { 
    @Id 
    @Column(name = "id") 
    private Long id; 
} 

@Entity 
@PrimaryKeyJoinColumn(name="bar_id") 
public class Foo extends Bar { 
} 

@Entity 
@PrimaryKeyJoinColumn(name="bar_id")  
public class Goo extends Bar { 
} 

जब इस तरह की एक मानदंड क्वेरी लेखन, मैं चाहते हैं, प्रदर्शन के लिए, उप वर्ग के साथ जुड़ने के बाईं एक का उपयोग करें:: चलो कल्पना हम सभी हाइबरनेट-जेपीए के साथ मैप किया निम्नलिखित वर्गों करते

getSession() 
    .createCriteria(Bar.class) 
    .createAlias("Foo", "foo", CriteriaSpecification.LEFT_JOIN) 
    .add(Restrictions.isNotNull("foo.bar_id")) 
    .list(); 

यह विफल रहता है, क्योंकि एसोसिएशन पथ "फू" स्पष्ट रूप से काम नहीं करता है, लेकिन यह मुझे बताएगा कि मैं क्या चाहता हूं। या इस प्रकार की क्वेरी करने का कोई और तरीका है? मुझे superclass पर प्रदर्शन करने की क्वेरी की जरूरत है। मैं एसक्यूएल में यह किया होता अगर यह इस तरह दिखेगा:

select b.* 
from bar b left join foo f on f.bar_id = b.id 
where f.bar_id is not null; 

SQL क्वेरी से ऊपर सिर्फ वर्णन करने के लिए है कि मैं क्या मतलब है, मैं जानता हूँ कि यह उपयोग करने के लिए एक "सामान्य" कि विशिष्ट मामले में शामिल होने के आसान होगा ।

उत्तर

7

यह वास्तव में स्पष्ट नहीं है कि आप क्या करना चाहते हैं।

सबसे पहले, चूंकि फू बार से विरासत में आता है, बार उदाहरणों की खोज करने से स्वचालित रूप से फू उदाहरण वापस आ जाएंगे। हाइबरनेट स्वयं टेबलों में शामिल होने का ख्याल रखता है।

दूसरा: आपकी एसक्यूएल क्वेरी वास्तव में अजीब है। आप एक बाएं शामिल कर रहे हैं (जिसका अर्थ है कि आप उन सलाखों की खोज कर रहे हैं जिनके पास कोई संबंधित फू नहीं हो सकता है), लेकिन आपके पास foo.bar_id पर नजदीक नहीं है।

getSession() 
    .createCriteria(Foo.class) 
    .list(); 
: यह वास्तव में एक आंतरिक में शामिल होने, और क्या आप क्या करना चाहते Foos के लिए खोज है, और Foos केवल, तो एक मानदंड फू के साथ रूट इकाई के रूप में उपयोग करते हैं

select b.* from bar b inner join foo f on f.bar_id = b.id 

के रूप में लिखा जा सकता है का गठन किया

आपको फू उदाहरण मिलेंगे, लेकिन चूंकि फू बार बढ़ाता है, इसलिए इन फू इंस्टेंस भी बार उदाहरण हैं। यही विरासत है।

Criteria c = getSession().createCriteria(Bar.class, "bar") 
// ... 
if (limitToFoos) { 
    c.add(Restrictions.eq("bar.class", Foo.class)); 
} 
+0

हाँ मैं के बारे में पता:

अब आप गतिशील रूप से अपने मानदंड उदाहरण का निर्माण कर रहे हैं, और कुछ का कहना है कि खोज केवल फू के उदाहरण लौटना चाहिए पर एहसास है, तो आप अंतर्निहित वर्ग संपत्ति का उपयोग करना पड़ एसक्यूएल-क्वेरी, यह सिर्फ बिंदु को स्पष्ट करने और प्रश्न को स्पष्ट करने के लिए था। मेरी क्वेरी बहुत जटिल आईआरएल है। हालांकि कक्षा संपत्ति के लिए एक प्रतिबंध जोड़ना पूरी तरह से काम करता है। जब आप इसके बारे में सोचते हैं तो काफी तर्क, धन्यवाद। – crunchdog

+0

'Restrictions.eq (" bar.class ", Foo.class)) 'मैं जो खोज रहा था - धन्यवाद! – jlb

संबंधित मुद्दे

 संबंधित मुद्दे