2009-06-12 7 views
5

मेरे पास दो वर्ग, व्यक्ति और कंपनी है, जो किसी अन्य वर्ग संपर्क से ली गई हैं। उन्हें दो तालिकाओं (व्यक्ति और कंपनी) में बहुरूप रूप से दर्शाया जाता है। सरलीकृत कक्षाएं इस तरह दिखेगा:हाइबरनेट पॉलीमोर्फिक क्वेरी

public abstract class Contact { 

    Integer id; 

    public abstract String getDisplayName(); 

} 

public class Person extends Contact { 

    String firstName; 
    String lastName; 

    public String getDisplayName() { 
    return firstName + " " + lastName; 
    } 

} 

public class Company extends Contact { 

    String name; 

    public String getDisplayName() { 
    return name; 
    } 

} 

समस्या यह है कि मैं एक प्रश्न DISPLAYNAME एक निश्चित स्ट्रिंग वाली के साथ सभी संपर्कों को खोजने बनाने की जरूरत है। मैं displayName का उपयोग कर क्वेरी नहीं बना सकता क्योंकि यह किसी भी तालिका का हिस्सा नहीं है। इस सवाल को कैसे करें इस पर कोई विचार?

+0

क्या आप इस जावा को टैग कर सकते हैं? –

उत्तर

4

क्योंकि आप जावा क्लास में समामेलन करते हैं, ऐसा कोई तरीका नहीं है कि हाइबरनेट वास्तव में आपकी मदद कर सकता है, क्षमा करें। यह आसानी से नहीं देख सकता कि आप इस विधि में क्या कर रहे हैं, क्योंकि वास्तव में यह दृढ़ता से संबंधित नहीं है।

अगर ऐसा है तालिका-प्रति-पदानुक्रम आप इस दृष्टिकोण का उपयोग कर सकते हैं:: किसी SQL लिखें जहां एक मापदंड क्वेरी के लिए खंड, और फिर एक मामले का उपयोग

समाधान कैसे आप इन कक्षाओं की विरासत मैप किया पर निर्भर करता है बयान:

s.createCriteria(Contact.class) 
.add(Restrictions.sqlRestriction("? = case when type='Person' then firstName || ' '|| lastName else name end")) 
.list(); 

अगर ऐसा है तालिका के अनुसार-ठोस-उपवर्ग, तो आपके पास दो प्रश्नों लेखन (के बाद से वह यह है कि क्या हाइबरनेट वैसे भी काम हो जाएगा) के बेहतर हैं।

+0

मेरे पास यह प्रति-कंक्रीट-श्रेणी तालिका के रूप में है। शायद सबसे तेज़ समाधान दो प्रश्नों को लिखना और उन्हें जावा पक्ष में जोड़ना है। – rmarimon

2

आप एक हाइबरनेट Interceptor के माध्यम से संबंधित displayName है, जिसे आप भर सकूं युक्त Contact तालिका में एक नया स्तंभ बनाने तो यह हमेशा स्वचालित रूप से सही स्ट्रिंग होते हैं सकता है।

विकल्प में दो प्रश्न होंगे, Person और Company तालिका के लिए एक, प्रत्येक में संबंधित खोज तर्क शामिल होगा। आपको LIKE क्वेरी के माध्यम से एक समेकित स्ट्रिंग की तलाश करने के लिए मूल प्रश्नों का उपयोग करना पड़ सकता है (हालांकि, मैं एक एचक्यूएल विशेषज्ञ नहीं हूं, हालांकि, यह संभव हो सकता है)।

यदि आपके पास बड़ी टेबल हैं, तो आपको वैकल्पिक रूप से पूर्ण-पाठ अनुक्रमण के बारे में सोचना चाहिए, क्योंकि LIKE '%...%' प्रश्नों को पूर्ण तालिका स्कैन की आवश्यकता होती है जब तक कि आपका डेटाबेस पूर्ण टेक्स्ट इंडेक्स का समर्थन न करे।

1

यदि आप डिस्प्लेनाम को मैप किए गए प्रॉपर्टी के रूप में बदलते हैं (कंपनी में नाम कॉलम पर सेट करें और पहले जैसे फॉर्मूला पर जाएं || '' अंतिम व्यक्ति में '), तो अनुबंध और हाइबरनेट के लिए पूछताछ दोनों प्रश्न दो प्रश्नों को चलाएगी जिनमें से अब एक प्रदर्शन नाम है। आप दो सूचियों की एक सूची वापस प्राप्त करेंगे, जिनमें से एक कंपनियां और एक व्यक्ति शामिल है, इसलिए आपको उन्हें एक साथ वापस विलय करना होगा। मुझे लगता है कि आपको अनुबंध के पूर्ण पैकेज नाम से पूछताछ करने की आवश्यकता है या इसके बारे में हाइबरनेट को बताने के लिए एक टाइपपीफ सेट अप करना होगा।