2011-09-07 17 views
26

क्या मानदंड API और NamedQuery के बीच निर्णय के लिए कोई ह्युरिस्टिक/सर्वोत्तम अभ्यास/नियम है?जेपीए नामांकित क्वेरीज़ बनाम मानदंड एपीआई?

मेरे विचार अब तक:
नामित प्रश्न आम तौर पर अधिक पठनीय होते हैं। मानदंड प्रश्न अधिक लचीला हैं।
दोनों precompiled हैं। जब तक संभव हो, नामित प्रश्नों का उपयोग करने पर भरोसा करते हैं, फिर मानदंडों में बदलते हैं।

लेकिन शायद मानदंड API का उपयोग कर क्वेरी को "flexify" करने का आग्रह उप-डिज़ाइन डिज़ाइन (यानी चिंताओं को अलग करना) का संकेत है?

धन्यवाद

उत्तर

33

नामित प्रश्न अधिक इष्टतम हैं (उन्हें एक बार पार्स/तैयार किया जाता है)। मानदंड प्रश्न गतिशील होते हैं, (वे प्रीकंपिल्ड नहीं होते हैं, हालांकि कुछ जेपीए प्रदाता जैसे ग्रहण लिंक्स एक मापदंड तैयार कैश बनाए रखते हैं)।

मैं केवल गतिशील प्रश्नों के लिए मानदंड का उपयोग करता हूं।

+0

से मैं सहमत हूं। अच्छा उत्तर! – Robin

+4

मुझे केवल मानदंड का उपयोग करना पसंद है। इकाई के मेटामोडेल के साथ मानदंड एपीआई को संयोजित करें और आप स्ट्रिंग के उपयोग को पूरी तरह से त्याग सकते हैं और एक वास्तविक गीला जावा जावा के लिए मजबूत टाइप कोड का उत्पादन कर सकते हैं! हालांकि, मैंने पाया [यह] (http://milestonenext.blogspot.se/2013/02/jpql-vs-criteria.html) परीक्षण जो वास्तव में दिखाता है कि मानदंड जेपीक्यूएल से भी बदतर है! –

+0

तकनीकी रूप से उस प्रदर्शन परीक्षण ने उत्पन्न मेटामोडेल का उपयोग नहीं किया जो जेपीए मानदंड API के बारे में सबसे अच्छा हिस्सा है। शुरुआत में हाइबरनेट मानदंड से जेपीए में स्विचिंग में मुझे बड़ी कठिनाई थी, लेकिन अब मैं वास्तव में जेपीए पसंद करता हूं। – Yinzara

10

मानदंड प्रश्नों एक अच्छा विकल्प है जब एक प्रश्न गतिशील चर और अधिक खोज मानदंड के आधार पर जेनरेट किया जाना चाहिए, उदाहरण के लिए कर रहे हैं।

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

3

एक और दृष्टिकोण यह है कि यद्यपि मानदंड क्वेरी इतनी पठनीय नहीं है, यह टाइपएफ़ है, इसलिए आपको संकलित समय प्रकार की जांच प्रदान करता है। यदि आप उन परियोजनाओं में डेटाबेस बदलते हैं जहां कई संस्थाएं और कई प्रश्न हैं, तो परिवर्तन के कारण क्या प्रश्न गलत हो गए हैं, यह संकलित समय में देखना वास्तव में उपयोगी है।

दूसरी ओर, मुझे यकीन है कि JPQL

2

की सादगी मैं वास्तव में हाइबरनेट (4.3.0-स्नैपशॉट) स्रोत और EclipseLink माध्यम से चला गया और अधिक से अधिक फायदेमंद है नहीं कर रहा हूँ (2.5.0-SNAPSHOT) स्रोत और प्रत्येक में जेपीए कार्यान्वयन के माध्यम से देखा।

EclipseLink स्पष्ट रूप से आपके द्वारा वर्णित तरीके से थ्रेड सुरक्षित नहीं है। विशेष रूप से यह बार-बार जुड़ने के लिए पुन: गणना करने का प्रयास करता है।

हाइबरनेट का कार्यान्वयन मेरे लिए धागा सुरक्षित दिखता है। मैं 100% निश्चित नहीं हूं, लेकिन ऐसा प्रतीत होता है। मैं कहूंगा कि भविष्य में यह सच होने की गारंटी नहीं है क्योंकि यह निर्दिष्ट नहीं है।

हालांकि, मैं आपको चेतावनी दूंगा, मुझे नहीं लगता कि आपको ज्यादा लाभ होगा। जो मैं देख रहा हूं उससे, क्वेरी का संकलन वास्तव में "createQuery" चरण के दौरान किया जाता है ताकि आप परिणाम को कैशिंग नहीं कर पाएंगे।

1

जेपीए @NamedQuery और @NamedQueries एनोटेशन का उपयोग करके नामित प्रश्नों के रूप में स्थिर प्रश्नों के निर्माण का एक तरीका भी प्रदान करता है। जब संभव हो तो गतिशील प्रश्नों पर नामित प्रश्नों को प्राथमिकता देने के लिए जेपीए में इसे एक अच्छा अभ्यास माना जाता है। http://www.objectdb.com/java/jpa/query/api

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