के माध्यम से हाइबरनेट मानदंडों का खुलासा यह कार्यान्वयन प्रश्न से अधिक डिज़ाइन है और यह मेरे साथ लंबे समय तक सहन करने जा रहा है। यह सबसे अच्छा एक उदाहरण के साथ समझाया है: सेवा एपीआई
चलो कहते हैं कि मैं एक व्यावसायिक इकाई उत्पाद बुलाया गुणों का एक गुच्छा (नाम, कीमत, विक्रेता, आदि ...) के साथ करते हैं।
यह एक इंटरफेस (उत्पाद) और कार्यान्वयन (ProductImpl, हाइबरनेट में मैप) के साथ ही बुनियादी CRUD सेवा इंटरफ़ेस (ProductService) और कार्यान्वयन (ProductServiceImpl) का प्रतिनिधित्व करती है।
उत्पाद और उत्पाद सेवा एपीआई के रूप में उजागर हैं, उनके कार्यान्वयन नहीं हैं।
मैं एक सूची findProducts (QueryCriteria मापदंड) को विधि ProductService कि दिए गए मापदंड संतोषजनक उत्पादों की एक सूची वापस होगा जोड़ना चाहते हैं। आवश्यकताएँ हैं: प्रत्यक्ष उत्पाद गुण (जैसे product.price gt 50.0
)
product.vendor.name = "Oracle"
)order by product.vendor.name desc, product.price asc"
) द्वारा
- क्वेरी
- अतिरिक्त फ़िल्टर लागू करें। उपर्युक्त 3 आइटमों के विपरीत जो सभी एपीआई क्लाइंट द्वारा निर्दिष्ट हैं, अतिरिक्त फ़िल्टर क्लाइंट की पहचान के आधार पर सेवा द्वारा लागू किए जा सकते हैं (उदाहरण के लिए क्लाइंट इस विधि का आह्वान कर सकता है केवल दिए गए विक्रेता द्वारा उत्पादित उत्पादों को देखकर सीमित हो सकता है)। इस तरह के फिल्टर ग्राहक द्वारा निर्दिष्ट मापदंड से प्राथमिकता दी जाती है (जैसे फिल्टर
product.vendor.name = "Microsoft"
पर सेट है, में क्वेरी (2) ऊपर खाली परिणाम सेट प्रस्तुत करना चाहिए।
सवाल है, इसलिए, क्या करना चाहिए QueryCriteria है इस तरह के एक विधि द्वारा उपयोग इंटरफ़ेस की तरह देखो मैं 3 समाधान के बारे में सोच सकते हैं और मुझे पसंद नहीं है या तो उनमें से एक:।
- ग्राहकों HQL सीधे (साथ "कहाँ" खंड शुरू) निर्दिष्ट करने के लिए अनुमति दें यह वह जगह है सबसे सरल समाधान, लेकिन सबसे समस्याग्रस्त सुरक्षा-वार भी। यह मानते हुए कि फ़िल्टर (ऊपर # 4) सरल हैं और हाइबरनेट के सत्र फ़िल्टर के माध्यम से लागू करने के लिए पर्याप्त है, एचक्यूएल को अभी भी कम से कम पार्स किया जाना चाहिए - सुनिश्चित करें कि क्वेरी पैरामीटर पैरामीटर के रूप में निर्दिष्ट हैं और इनलाइन नहीं हैं।
- उपयोग बारीकी QueryCriteria के स्थान पर हाइबरनेट के DetachedCriteria लपेटा। "पतला लपेटा" क्योंकि क्लाइंट को डिटेक्टेडक्रिटिया बनाने की अनुमति नहीं दी जा सकती है, इसके लिए सीधे मैप किए गए इकाई को नियंत्रित करने का कोई तरीका नहीं होगा। इसके अलावा, यह कुछ प्रश्नों के लिए एचक्यूएल के रूप में लचीला नहीं होगा, मानदंड एपीआई के माध्यम से आसानी से (या बिल्कुल) स्पष्ट नहीं है। एचक्यूएल दृष्टिकोण के साथ, फ़िल्टर (ऊपर # 4) हाइबरनेट सत्र फ़िल्टर तक सीमित होंगे।
- अपना खुद का लिखें QueryCriteria इंटरफ़ेस/कार्यान्वयन जो दृश्यों के पीछे या तो पृथकक्रिटिया या एचक्यूएल बना देगा। शायद सबसे लचीला समाधान होने पर, इसे मानदंड एपीआई से बहुत सारे कोड को डुप्लिकेट करना होगा जो आदर्श से कम लगता है।
उपर्युक्त दृष्टिकोण की वैधता पर कोई टिप्पणी या उंगलियों को पार किया गया - सरल सुरुचिपूर्ण समाधान जो मेरे साथ नहीं हुआ, उसकी अत्यधिक सराहना की जाएगी।
पीएस मेरे विशिष्ट मामले में, सभी एपीआई क्लाइंट आंतरिक और "अर्ध-भरोसेमंद" होते हैं - यह है कि मैं जानबूझकर खराब प्रोग्रामिंग के साथ कुछ तोड़ने की कोशिश कर रहा हूं जिसके परिणामस्वरूप 5 टेबलों के कार्टेशियन उत्पाद में परिणाम होता है :-) हालांकि, यह एक ऐसे समाधान के साथ आने के लिए अच्छा होगा जो जनता के लिए एपीआई एक्सपोजर का सामना करेगा।
ऐसा लगता है कि यह प्रश्न दो महीने तक रहा है; मैं उत्सुक हूँ कि आप किस पर बस गए? मुझे लगता है कि मैंने # 3 ले लिया होगा, "अपना खुद का लिखें ..." दृष्टिकोण, और उपयोग के आधार पर उत्पाद सेवा/मानदंड API पर पूछे जाने वाले गुणों के टुकड़ों को "फ़्लैट" करने की कोशिश की। – RMorrisey
@RMorrisey - मैंने अपने समाधान का वर्णन करने वाला एक जवाब जोड़ा है। – ChssPly76