जेपीए और हाइबरनेट - मानदंड बनाम जेपीक्यूएल या एचक्यूएल


295

मानदंड या HQL का उपयोग करने के नियम और विपक्ष क्या हैं ? मानदंड हाइबरनेट में प्रश्नों को व्यक्त करने के लिए एक अच्छा ऑब्जेक्ट-ओरिएंटेड तरीका है, लेकिन कभी-कभी हाइटेक की तुलना में क्राइटेरिया क्वेरीज़ को समझना / निर्माण करना अधिक कठिन होता है।

आप मानदंड का उपयोग कब करते हैं और HQL कब करते हैं? आप किन मामलों में उपयोग करना पसंद करते हैं? या यह सिर्फ स्वाद की बात है?


सही उत्तर 'उपयोग मामले पर निर्भर करता है' होगा।
२०:२२

और इस उपकरण के बारे में क्या ? यह एक सामान्य तरीके से सामान्य प्रश्नों का निर्माण करने की अनुमति देता है: संरक्षित खण्ड चयन () {वापसी em.select ("DISTININ i") .from (this.getName) (), "i") .joinFetch ("i.locale lf")। } public T findBySlug (स्ट्रिंग स्लग) {return (T) this.select () .join ("i.locale l"); .where ("l.slug =?", slug) .fetchSingle (); }
वोजटच

1
एक राय आधारित प्रश्न की परिभाषा, अभी तक लोगों ने इसे बंद करने का अवसर नहीं लिया है ... साइट के अनुसार FAQ

जवाबों:


212

मैं ज्यादातर गतिशील प्रश्नों के लिए मानदंड क्वेरी पसंद करता हूं। उदाहरण के लिए गतिशील रूप से कुछ ऑर्डर जोड़ना या कुछ मापदंडों (जैसे प्रतिबंध) को कुछ पैरामीटर के आधार पर छोड़ना बहुत आसान है।

दूसरी ओर मैं स्थैतिक और जटिल प्रश्नों के लिए HQL का उपयोग कर रहा हूं, क्योंकि HQL को समझना / पढ़ना बहुत आसान है। इसके अलावा, HQL थोड़ा अधिक शक्तिशाली है, मुझे लगता है, उदाहरण के लिए विभिन्न प्रकारों के लिए।


13
इसके अलावा, यद्यपि मानदंड थोड़ा अधिक सुरक्षित है, केवल एक चीज जो आपको सुरक्षित महसूस करा सकती है वह है परीक्षण।

क्या ऐसे कुछ अच्छे उदाहरण हैं जो बताते हैं कि HQL कुछ मामलों में मानदंड एपीआई से बेहतर क्यों है? मैंने एक ब्लॉग का अंत पढ़ा, लेकिन कुछ भी नहीं समझा। यदि आप मदद कर सकते हैं तो इसकी सराहना करेंगे। धन्यवाद। लिंक - javalobby.org/articles/hibernatequery102
एरान मोराद

उपरोक्त सभी कारण - मैं एचक्यूएल को मानदंड भी पसंद करता हूं क्योंकि यह प्रोग्रामर के लिए सुरक्षित है, कोडिंग त्रुटियों को कम करता है - एचक्यूएल स्ट्रिंग पर संकलन मान्य नहीं है।
नूनो

हालाँकि, पेजिंग के दौरान अलग-अलग संस्थाओं को पुनः प्राप्त करने का मुद्दा है। जब मैं ऐसा करने के लिए मुद्दों से बचने के लिए HQL चुनूँगा ...
एंथोनी वेबस्टर

कॉलम नामों के लिए एक मेटामोडेल के साथ मापदंड क्वेरी का उपयोग करने से कोड में सभी घटनाओं का नाम बदलने के लिए आधुनिक आईडीई से कुछ भी नहीं तोड़ने के लिए और एक साधारण आदेश के साथ रिफैक्टरिंग करने में मदद मिलती है।
मैसिमो

92

HQL और मानदंड के बीच प्रदर्शन के मामले में अंतर है, जब आप मानदंड का उपयोग करके किसी क्वेरी को आग लगाते हैं, तो यह तालिका नाम के लिए एक नया उपनाम बनाता है जो किसी भी DB के लिए अंतिम रूप से कैश में प्रतिबिंबित नहीं होता है। यह उत्पन्न SQL को संकलित करने के लिए एक ओवरहेड की ओर जाता है, जिसे निष्पादित करने में अधिक समय लगता है।

लाने की रणनीतियों के बारे में [http://www.hibernate.org/315.html]

  • मानदंड आपके मैपिंग में आलस्य सेटिंग्स का सम्मान करता है और गारंटी देता है कि आप जो लोड करना चाहते हैं वह लोड है। इसका मतलब यह है कि एक मानदंड क्वेरी का परिणाम हो सकता है कि सभी गैर-आलसी मैप किए गए संघों और संग्रह के साथ सबग्राफ लाने के लिए कई एसक्यूएल तत्काल चयन करें। यदि आप "कैसे" और यहां तक ​​कि "क्या" को बदलना चाहते हैं, तो किसी विशेष संग्रह या एसोसिएशन के लिए बाहरी जुड़ाव को सक्षम या अक्षम करने के लिए setFetchMode () का उपयोग करें। मानदंड प्रश्न भी पूरी तरह से भ्रूण की रणनीति का सम्मान करते हैं (बनाम बनाम सेलेक्ट में शामिल हों)।
  • HQL आपके मैपिंग में आलस्य सेटिंग्स का सम्मान करता है और गारंटी देता है कि आप जो लोड करना चाहते हैं वह लोड है। इसका मतलब है कि एक HQL क्वेरी के परिणामस्वरूप सभी गैर-आलसी मैप किए गए संघों और संग्रह के साथ सबग्राफ लाने के लिए कई SQL तत्काल चयन बयान हो सकते हैं। यदि आप "कैसे" और यहां तक ​​कि "क्या" को बदलना चाहते हैं, तो किसी विशेष संग्रह या एक से अधिक-से-एक या एक-से-एक एसोसिएशन, या JOIN FCHCH को सक्षम करने के लिए बाहरी रूप से जुड़ने में सक्षम करने के लिए LEFT JOIN FETCH का उपयोग करें। एक गैर-अशक्त कई-से-एक या एक-से-एक एसोसिएशन के लिए आंतरिक जुड़ना। HQL क्वेरीज़ मैपिंग डॉक्यूमेंट में परिभाषित किसी भी प्रकार के "fetch =" जॉइन का सम्मान नहीं करती हैं।

1
बस किसी को ब्राउज़ करने के लिए इशारा करते हैं। यह उत्तर 2008 से है। अब शायद ऐसा नहीं होगा। dimovelev.blogspot.com/2015/02/…
Amalgovinus

41

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

  1. बाकी सभी समान हैं, OO संस्करण त्रुटि के लिए कुछ कम प्रवण है। किसी भी पुराने स्ट्रिंग को HQL क्वेरी में जोड़ा जा सकता है, जबकि केवल वैध क्राइटेरिया ऑब्जेक्ट्स इसे क्राइटेरिया ट्री में बना सकते हैं। प्रभावी रूप से, मानदंड वर्ग अधिक विवश हैं।
  2. ऑटो-पूर्ण के साथ, OO अधिक खोज योग्य है (और इस तरह उपयोग करना आसान है, मेरे लिए कम से कम)। आपको यह याद रखने की आवश्यकता नहीं है कि क्वेरी के कौन से हिस्से कहाँ जाते हैं; IDE आपकी मदद कर सकता है
  3. आपको सिंटैक्स के विवरणों को याद रखने की भी आवश्यकता नहीं है (जैसे कि प्रतीक कहाँ जाते हैं)। आपको बस यह जानने की जरूरत है कि तरीकों को कैसे कॉल करें और ऑब्जेक्ट बनाएं।

चूँकि HQL SQL की तरह बहुत अधिक है (जो कि अधिकांश देव पहले से ही अच्छी तरह से जानते हैं) तो इन "याद रखने की ज़रूरत नहीं" तर्क बहुत वजन नहीं उठाते हैं। यदि HQL अधिक भिन्न था, तो यह अधिक आयातकर्ता होगा।


12
इन तर्कों में पानी (एचक्यूएल के संबंध में) नहीं है। इसमें स्ट्रिंग कॉन्फैक्शन शामिल नहीं है। कि OO संस्करण त्रुटियों के लिए कम संभावनाहीन है। यह त्रुटियों के समान ही है, लेकिन एक अलग तरह का है। यह जानने का प्रयास कि कॉल करने के तरीके
एचक्यूएल में

क्या ऐसे कुछ अच्छे उदाहरण हैं जो बताते हैं कि HQL कुछ मामलों में मानदंड एपीआई से बेहतर क्यों है? मैंने एक ब्लॉग का अंत पढ़ा, लेकिन कुछ भी नहीं समझा। यदि आप मदद कर सकते हैं तो इसकी सराहना करेंगे। धन्यवाद। लिंक - javalobby.org/articles/hibernatequery102
एरन मोराद

1
HQL नाम के प्रश्नों को संकलित समय पर और इस बिंदु पर अनुपलब्ध फ़ील्ड (शायद खराब रिफैक्टर्स के लिए) संकलित किया गया है। मुझे लगता है कि यह कोड को अधिक लचीला बनाता है और वास्तव में मापदंड से कम त्रुटि वाला होता है।
narduk

मानदंड में स्वत: पूर्ण बहुत बेकार है क्योंकि गुण सिर्फ तार हैं।
लुलिस मार्टिनेज

35

मैं आमतौर पर मानदंड का उपयोग करता हूं जब मुझे पता नहीं होता है कि डेटा के किस टुकड़े पर इनपुट का उपयोग किया जाएगा। जैसे सर्च फॉर्म पर जहां उपयोगकर्ता 1 से 50 आइटम दर्ज कर सकता है और मुझे पता नहीं है कि वे क्या खोज रहे हैं। उपयोगकर्ता को जो खोज रहा है, उसके लिए जाँच करने के माध्यम से केवल मानदंड को अधिक संलग्न करना बहुत आसान है। मुझे लगता है कि उस परिस्थिति में HQL क्वेरी डालना थोड़ा अधिक परेशानी वाला होगा। HQL बहुत अच्छा है, हालांकि जब मुझे पता है कि मुझे क्या चाहिए।


1
यह एक अच्छी टिप्पणी है। वर्तमान में हम खोज फॉर्म के लिए बहुत बड़े एचक्यूएल स्ट्रिंग्स का निर्माण करते हैं जिसमें कई अलग-अलग ऑब्जेक्ट शामिल होते हैं। कुरूप लगता है। यह देखने के लिए कि क्या कोई क्राइटेरिया साफ कर सकता है। दिलचस्प ...
cbmeeks 14

धन्यवाद। यह एक उत्कृष्ट उदाहरण है। क्या आप मुझे कुछ और दे सकते हैं?
एरान मोराद

31

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


22

मानदंड प्राकृतिक कुंजी लुकअप को निर्दिष्ट करने का एकमात्र तरीका है जो दूसरे स्तर के क्वेरी कैश में विशेष अनुकूलन का लाभ उठाता है। HQL के पास आवश्यक संकेत निर्दिष्ट करने का कोई तरीका नहीं है।

आप कुछ और जानकारी यहाँ पा सकते हैं:


21

क्राइटेरिया आपी हाइबरनेट की अच्छी अवधारणा में से एक है। मेरे विचार के अनुसार ये कुछ बिंदु हैं जिनके द्वारा हम HQL और मानदंड Api के बीच अंतर कर सकते हैं

  1. HQL को डेटा पर सेलेक्ट और नॉन-सेलेक्ट दोनों तरह के ऑपरेशन करने हैं, लेकिन मानदंड केवल डेटा के चयन के लिए है, हम मानदंड का उपयोग करके नॉन-सेलेक्ट ऑपरेशन नहीं कर सकते।
  2. HQL स्टेटिक क्वेरी को निष्पादित करने के लिए उपयुक्त है, जहां मानदंड गतिशील क्वेरी को निष्पादित करने के लिए उपयुक्त है
  3. HQL का समर्थन नहीं करता पृष्ठांकन अवधारणा है, लेकिन हम मानदंड के साथ पृष्ठांकन प्राप्त कर सकते हैं।
  4. मानदंड HQL से निष्पादित करने के लिए अधिक समय लेता था।
  5. मानदंड के साथ हम SQL इंजेक्शन के साथ अपनी गतिशील क्वेरी पीढ़ी के कारण सुरक्षित हैं लेकिन HQL में क्योंकि आपके प्रश्न या तो तय हैं या पैराट्राइज्ड हैं, SQL इंजेक्शन से सुरक्षित नहीं है

11
अंक के युगल limit offset:rowssetParameter
अंकन

13

दोनों दुनिया के सर्वश्रेष्ठ का उपयोग करने के लिए, HQL की अभिव्यक्ति और संक्षिप्तता और क्राइटेरिया की गतिशील प्रकृति Querydsl का उपयोग करने पर विचार करें ।

Querydsl JPA / Hibernate, JDO, SQL और संग्रह का समर्थन करता है।

मैं Querydsl का अनुचर हूं, इसलिए यह उत्तर पक्षपाती है।


13

मेरे लिए क्राइटेरिया को समझना और डायनामिक क्वेश्चन बनाना काफी आसान है। लेकिन जो दोष मैं अब तक कहता हूं, वह यह है कि यह सभी कई-एक आदि संबंधों को लोड करता है क्योंकि हमारे पास केवल तीन प्रकार के FetchModes हैं, जैसे चयन, प्रॉक्सी और डिफ़ॉल्ट और इन सभी मामलों में यह कई-एक को लोड करता है (यदि मैं गलत हूं तो मदद कर सकता हूं) मै बाहर :))

मानदंड के साथ दूसरा मुद्दा यह है कि यह पूरी वस्तु को लोड करता है अर्थात यदि मैं किसी कर्मचारी का नाम मात्र लोड करना चाहता हूं तो यह इस तरह से नहीं आएगा कि यह पूरी कर्मचारी वस्तु के साथ आए और मैं इससे प्राप्त कर सकता हूं क्योंकि यह वास्तव में बुरा काम है रिपोर्टिंग । जहां HQL के रूप में सिर्फ लोड (एसोसिएशन / संबंधों को लोड नहीं करता है) क्या यू कई बार प्रदर्शन बढ़ाते हैं।

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

इसके अलावा यदि आप उर aspx.cs फ़ाइलों में HQL लिखते हैं, तो आप कसकर ur DAL के साथ युग्मित होंगे।

कुल मिलाकर मेरा निष्कर्ष यह है कि ऐसी जगहें हैं जहां यू HQL के बिना नहीं रह सकते हैं जैसे कि रिपोर्टें उन्हें उपयोग करती हैं इसलिए मानदंड का प्रबंधन करना अधिक आसान है।


13
HQL SQL इंजेक्शन सुरक्षित नहीं है
वरुण मेहता 19

मुझे लगता है कि क्राइटेरिया इंजेक्शन सुरक्षित नहीं है। मेरी पोस्ट यहाँ देखें: stackoverflow.com/questions/6746486/…
मिस्टर स्मिथ

4
HQL IS sql injection 'setParameter' को जोड़कर सुरक्षित है
Javatar

2
@Zafar: आप अनुमानों का उपयोग कर एक इकाई के केवल कुछ गुण का चयन कर सकते
राज़्वान फ्लेवियस पांडा

@ ज़फ़र आप विशेष कॉलम चुनने के लिए मापदंड क्वेरी में प्रक्षेपण सेट कर सकते हैं। आप EmpName प्राप्त कर सकते हैं, पूर्ण ऑब्जेक्ट लाने की कोई आवश्यकता नहीं है।
खत्री

12

मानदंड एपीआई

मानदंड गतिशील रूप से उत्पन्न प्रश्नों के लिए बेहतर अनुकूल है। इसलिए, यदि आप WHERE क्लॉज़ फ़िल्टर जोड़ना चाहते हैं, तो JOIN क्लॉज़ या प्रोजेक्शन कॉलम में ORDER को अलग-अलग करें, तो मानदंड API आपको क्वेरी को गतिशील रूप से उत्पन्न करने में मदद कर सकता है जो SQL इंजेक्शन के हमलों को भी रोकता है

दूसरी ओर, मानदंड प्रश्न कम अभिव्यंजक हैं और यहां तक ​​कि बहुत जटिल और अक्षम SQL प्रश्न हो सकते हैं, जैसा कि इस लेख में बताया गया है ।

JPQL और HQL

JPQL JPA मानक इकाई क्वेरी भाषा है जबकि HQL JPQL का विस्तार करता है और कुछ हाइबरनेट-विशिष्ट सुविधाएँ जोड़ता है।

JPQL और HQL बहुत एक्सप्रेसिव हैं और SQL से मिलते जुलते हैं। मानदंड API के विपरीत, JPQL और HQL ने JPA प्रदाता द्वारा उत्पन्न अंतर्निहित SQL क्वेरी की भविष्यवाणी करना आसान बना दिया है। मानदंड की तुलना में किसी के HQL प्रश्नों की समीक्षा करना बहुत आसान है।

यह ध्यान देने योग्य है कि JPQL या मानदंड एपीआई के साथ संस्थाओं का चयन करना समझ में आता है अगर आपको उन्हें संशोधित करने की आवश्यकता है। अन्यथा, एक डीटीओ प्रोजेक्शन एक बेहतर विकल्प है।

निष्कर्ष

यदि आपको इकाई क्वेरी संरचना को अलग करने की आवश्यकता नहीं है, तो JPQL या HQL का उपयोग करें। यदि आपको फ़िल्टरिंग या सॉर्टिंग मानदंड बदलने या प्रक्षेपण को बदलने की आवश्यकता है, तो मानदंड एपीआई का उपयोग करें।

हालाँकि, सिर्फ इसलिए कि आप JPA या हाइबरनेट का उपयोग कर रहे हैं, इसका मतलब यह नहीं है कि आपको देशी SQL का उपयोग नहीं करना चाहिए। SQL क्वेरी बहुत उपयोगी हैं और JPQL और मानदंड API SQL के लिए एक प्रतिस्थापन नहीं हैं। की जाँच करें इस लेख में इस विषय के बारे में अधिक जानकारी के लिए।



11

मेरे लिए मानदंड पर सबसे बड़ी जीत उदाहरण एपीआई है, जहां आप एक ऑब्जेक्ट पास कर सकते हैं और हाइबरनेट उन ऑब्जेक्ट गुणों के आधार पर एक क्वेरी बनाएंगे।

इसके अलावा, मानदंड एपीआई के पास अपने quirks हैं (मेरा मानना ​​है कि हाइबरनेट टीम एपी के लिए काम कर रही है), जैसे:

  • मानदंड। क्रेटएआलीस ("ओब्ज") एक संभावित बाहरी जुड़ाव के बजाय एक आंतरिक जुड़ने को मजबूर करता है
  • आप एक ही उपनाम दो बार नहीं बना सकते
  • कुछ sql खंडों का कोई सरल मानदंड प्रतिपक्ष नहीं है (जैसे कि एक subselect)
  • आदि।

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

HQL का एक और लाभ यह है कि आप अपने सभी प्रश्नों को हाथ से पहले परिभाषित कर सकते हैं, और यहां तक ​​कि उन्हें एक फ़ाइल या तो बाहरी रूप से भी देख सकते हैं।


9

मानदंड एपीआई एक विशिष्ट सुविधा प्रदान करता है जो न तो SQL या HQL प्रदान करता है। अर्थात। यह एक क्वेरी के संकलन समय की जाँच करने की अनुमति देता है।


7

हमने शुरुआत में अपने आवेदन में मुख्य रूप से मानदंड का उपयोग किया था लेकिन प्रदर्शन के मुद्दों के कारण इसे HQL के साथ बदल दिया गया था।
मुख्य रूप से हम कई जोड़ के साथ बहुत ही जटिल प्रश्नों का उपयोग कर रहे हैं जो मानदंड में कई प्रश्नों की ओर ले जाता है लेकिन HQL में बहुत अनुकूलित है।
मामला यह है कि हम विशिष्ट वस्तु पर सिर्फ कई भविष्यवाणियों का उपयोग करते हैं और वस्तुओं को पूरा नहीं करते हैं। मानदंड के साथ समस्या भी कठोर थी।
मान लें कि यदि आपको (name || ' ' || surname)एचक्यूएल में उपयोगकर्ता का नाम और उपनाम प्रदर्शित करने की आवश्यकता है, तो यह काफी आसान है लेकिन क्रेटिया में यह संभव नहीं है।
इससे उबरने के लिए हमने ResultTransormers का उपयोग किया, जहां ऐसी विधियाँ थीं जहाँ आवश्यक परिणाम के लिए इस तरह के संघनन को लागू किया गया था।
आज हम मुख्य रूप से इस तरह HQL का उपयोग करते हैं:

String hql = "select " +
            "c.uuid as uuid," +
            "c.name as name," +
            "c.objective as objective," +
            "c.startDate as startDate," +
            "c.endDate as endDate," +
            "c.description as description," +
            "s.status as status," +
            "t.type as type " +
            "from " + Campaign.class.getName() + " c " +
            "left join c.type t " +
            "left join c.status s";

Query query =  hibernateTemplate.getSessionFactory().getCurrentSession().getSession(EntityMode.MAP).createQuery(hql);
query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
return query.list();

इसलिए हमारे मामले में दिए गए रिकॉर्ड आवश्यक गुणों के नक्शे हैं।


1
मानदंड के साथ आप org.hibernate.criterion.CriteriaSpecification.ALIAS_TO_ENTITY_MAP
AA

मेरे अनुभव में नक्शों की सूची वापस करने से बहुत बुरा प्रदर्शन होता है। मैं ऑब्जेक्ट सरणियों की सूची या बीन्स की सूची वापस करना पसंद करता हूं (आप हमेशा एक बीन को परिभाषित कर सकते हैं जो आपके विशिष्ट परिणाम सेट के अनुरूप है)।
लुलिस मार्टिनेज

7
  • HQL डेटा पर चुनिंदा और गैर-दोनों प्रकार के संचालन करने के लिए है, लेकिन मानदंड केवल डेटा का चयन करने के लिए है, हम मानदंड का उपयोग करके गैर-चयन संचालन नहीं कर सकते हैं
  • HQL स्टेटिक क्वेरी को निष्पादित करने के लिए उपयुक्त है, जहां मानदंड गतिशील क्वेरी को निष्पादित करने के लिए उपयुक्त है
  • HQL अंकुरण अवधारणा का समर्थन नहीं करता है, लेकिन हम मानदंड के साथ पृष्ठांकन प्राप्त कर सकते हैं
  • मानदंड तब HQL निष्पादित करने के लिए अधिक समय लेता था
  • मानदंड के साथ हम इसकी गतिशील क्वेरी पीढ़ी के कारण SQL इंजेक्शन के साथ सुरक्षित हैं, लेकिन HQL में क्योंकि आपके प्रश्न या तो निश्चित हैं या पैराड्राइज्ड हैं, SQL इंजेक्शन से सुरक्षित नहीं है।

स्रोत


स्पष्ट करने के लिए, हाइबरनेट के मानदंड एपीआई का उपयोग करने वाले मानदंड क्वेरी क्वेरी के लिए उपलब्ध हो सकते हैं, लेकिन जेपीए मापदंड क्वेरीज़ का चयन, अद्यतन और विलोपन को कवर करती है। देखें CriteriaUpdate<T>और CriteriaDelete<T>संदर्भ के लिए।
Naros

5

गतिशील रूप से हम अपने इनपुट्स के आधार पर क्वेरी का निर्माण कर सकते हैं। एचक्यूएल क्वेरी के मामले में हम एक बार क्वेरी का ढांचा नहीं बदल सकते हैं।


2
ऐसा नहीं। HQL के साथ आप ':' पहचानकर्ता के साथ गुण सेट कर सकते हैं, और फिर उन गुणों को अद्वितीय मानों से बदल सकते हैं। उदाहरण के लिए, क्वेरी q = session.createQuery ("Select: aValue FROM my_table"); और फिर q.setParameter ("aValue", "some_column_name");
मैट

@MattC आपके उदाहरण में आप पैरामीटर के मान बदल रहे हैं, क्वेरी की संरचना नहीं।
सीजर

4

मैं यहाँ एक मृत घोड़े को मारना नहीं चाहता, लेकिन यह उल्लेख करना महत्वपूर्ण है कि क्राइटेरिया के प्रश्नों को अब हटा दिया गया है। HQL का उपयोग करें।


1

मैं गतिशील प्रश्नों के लिए मानदंड क्वेरी भी पसंद करता हूं। लेकिन मैं डिलीट क्वेश्चन के लिए hql को प्राथमिकता देता हूं, उदाहरण के लिए यदि पैरेंट आईडी 'xyz' के लिए चाइल्ड टेबल से सभी रिकॉर्ड्स को डिलीट कर दें, तो यह HQL द्वारा आसानी से हासिल कर लिया जाता है, लेकिन मापदंड API के लिए पहले हमें डिलीट क्वेरी की संख्या फायर करनी चाहिए जहां n बच्चे की संख्या है तालिका रिकॉर्ड।


0

यहाँ अधिकांश उत्तर भ्रामक हैं और इसका उल्लेख करते हैं Criteria Queries हैं धीमी है HQL, जो वास्तव में ऐसा नहीं है।

यदि आप गहरी तल्लीन करते हैं और कुछ परीक्षण करते हैं जो आप देखेंगे क्राइटेरिया क्वेरीज़ नियमित रूप से एचक्यूएल को बेहतर प्रदर्शन करती हैं

और मानदंड क्वेरी के साथ भी आपको ऑब्जेक्ट ओरिएंटेड नियंत्रण मिलता है जो कि वहां नहीं है HQL के

अधिक जानकारी के लिए इस उत्तर को यहां पढ़ें ।


0

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


0

यह पद काफी पुराना है। अधिकांश उत्तर हाइबरनेट मानदंडों के बारे में बात करते हैं, न कि जेपीए मानदंड। जेपीए 2.1 ने क्राइटेरियाडेलीट / क्राइटेरियाअपडेट और एंटिटीग्राफ को जोड़ा, जो वास्तव में लाने के लिए नियंत्रित करता है। जावा के OO होने के बाद से मानदंड एपीआई बेहतर है। यही कारण है कि जेपीए बनाया गया है। जब JPQL संकलित किया जाता है, तो इसे SQL में अनुवादित होने से पहले AST ट्री (OO मॉडल) में अनुवाद किया जाएगा।


-3

HQL SQL इंजेक्शन की तरह सुरक्षा चिंताओं का कारण बन सकता है ।


11
ये मुद्दे एचक्यूएल के कारण नहीं हैं, बल्कि बुनियादी सॉफ्टवेयर विकास प्रथाओं की समझ की कमी के कारण हैं। मैं मानदंड एपीआई के साथ ही sql इंजेक्शन हमलों के लिए कोड प्रवण बना सकते हैं।
जेन्स स्काउडर

1
यह कहना "जावा से एक RDBMS क्वेरी SQL इंजेक्शन सुरक्षा चिंताओं का कारण बन सकता है": D
Czar
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.