2011-02-03 19 views
11

मैं एक सामान्य तालिका "नमूना" पर एक प्रश्न के निर्माण कर रहा हूँ और मैं जो इस तालिका "SampleOne", "SampleTwo" से विरासत कई प्रकार के साथ क्वेरी। मैं की तरह एक प्रश्न की आवश्यकता होती है:जावा/जेपीए | निर्दिष्ट विरासत में मिला प्रकार

select s from Sample where s.type = :type 

जहां प्रकार तालिका के एक discriminator मूल्य होगा। यह किसी भी तरह से संभव है (और एक इकाई विशिष्ट प्रश्न, प्रत्येक SampleOne, SampleTwo के लिए एक ... आदि बनाने के लिए बचने के लिए),

मैं बहुत इस विषय में किसी भी इनपुट की सराहना करेंगे

सधन्यवाद, पी ।

उत्तर

15

जेपीए 2.0 में आप TYPE अभिव्यक्ति का उपयोग कर सकते हैं (हालांकि वर्तमान में यह हाइबरनेट में मानकों के साथ काम नहीं करता है, HHH-5282 देखें):

select s from Sample s where TYPE(s) = :type 

समान हाइबरनेट विशिष्ट अभिव्यक्ति .class है:

select s from Sample s where s.class = :type 
+0

क्षमा समान विषय पर नई चर्चा शुरू करने के लिए, लेकिन यह काम करता है अगर मैं के रूप में एक अमूर्त वर्ग प्रदान करते हैं:: प्रकार

आप कुछ इस तरह करने से इस समस्या को वैकल्पिक हल कर सकते हैं? –

+0

https://hibernate.atlassian.net/browse/HHH-4881 के अनुसार यह हाइबरनेट 4.0.0 में तय किया गया है।सीआर 5 –

3

यहाँ relevant section of the Java EE 6 tutorial है:

सार संस्थाओं

एक अमूर्त वर्ग द्वारा @Entity के साथ कक्षा को सजाने वाली इकाई घोषित किया जा सकता है। सार इकाइयां कंक्रीट इकाइयों की तरह हैं लेकिन इन्हें तत्काल नहीं किया जा सकता है।

सार संस्थाओं सिर्फ ठोस संस्थाओं की तरह पूछे जा सकता है।

@Entity 
public abstract class Employee { 
    @Id 
    protected Integer employeeId; 
    ... 
} 
@Entity 
public class FullTimeEmployee extends Employee { 
    protected Integer salary; 
    ... 
} 
@Entity 
public class PartTimeEmployee extends Employee { 
    protected Float hourlyWage; 
} 

यदि मैं यह सही पढ़ा है, आपकी क्वेरी:

select s from Sample where s.type = :type 
एक सार इकाई एक प्रश्न का लक्ष्य है, तो क्वेरी सार इकाई के सभी ठोस उपवर्गों पर चल रही है

केवल निर्दिष्ट उप-प्रकार के तत्वों को लौट जाना चाहिए अगर type discriminator स्तंभ है, इसलिए केवल बात यह है कि तुम क्या करने के लिए अब सिर्फ़ अपने अनुरोध किया उप प्रकार के परिणाम सूची कास्ट करने के लिए है।

1

आप अभी भी हाइबरनेट 4.3.7 में सावधान रहना होगा अभी भी TYPE() के कार्यान्वयन के साथ एक मुद्दा है क्योंकि वहाँ उदाहरण के लिए,:

from SpoForeignPilot sfp where TYPE(sfp.partDocument) = :type 

यह क्वेरी काम नहीं करती है क्योंकि यह गलत तरीके से SpoForeignPilot के प्रकार की जांच करता है और दस्तावेज़ के प्रकार का नहीं।

select sfp from SpoForeignPilot sfp join sfp.partDocument doc where TYPE(doc) = :type 
+0

यह पांच साल के प्रश्न के लिए कुछ भी नया नहीं जोड़ता है। – meskobalazs

+2

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

+0

@WimDeRammelaere मेरे सिर खरोंच के घंटों के बाद, आपके उत्तर ने मुझे मेरी क्वेरी के साथ समस्या को खोजने में मदद की। निचली पंक्ति यह है कि, जब मैंने ** टाइप ** का उपयोग किया था, जहां क्लॉज ने काम करने के लिए आवेदन किया था, लेकिन पथ अभिव्यक्ति पर उपयोग किए जाने पर कोई परिणाम नहीं मिला। – Maciek

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