दिलचस्प पोस्ट
डीएलएल में EXE को मिलाएं? PHP में बहु-आयामी सरणी से डुप्लिकेट मान कैसे निकालें कर्ली ब्रेस प्लेसमेंट के आधार पर एक परिणाम भिन्न क्यों होता है? जावा एफएक्स – क्या यह वास्तव में एक ब्राउज़र में तैनात किया जा सकता है? त्रुटि "'डिक्ट ऑब्जेक्ट' का कोई विशेषता नहीं है 'इटरिटम्स'" जब नेटवर्कएक्स की लिस्ट_एसएचपी () का उपयोग करने की कोशिश कर रहा है प्रारंभ करने के बाद आप सी ++ सरणी का आकार बदल सकते हैं? छवि को एक गतिविधि से दूसरी गतिविधि से पास करना कैसे चेतावनी बॉक्स की शैली को बदलने के लिए जावा अनुप्रयोग में अनुकूलन शॉर्टकट dplyr: कैसे एक समारोह के अंदर group_by का उपयोग करें? MySQL में एकाधिक तालिकाओं से कैसे हटाना है? मैं सी # / .NET में एक एसएफटीपी सर्वर पर एक फाइल कैसे अपलोड कर सकता हूं? जावा जेनेरिक 'प्रकार पैरामीटर में प्रश्न चिह्न क्या मतलब है? स्ट्रिंग से गैर- utf8 वर्ण निकालें कॉलबैक विधि अगर उपयोगकर्ता ने पुश नोटिफिकेशन प्रॉम्प्ट अस्वीकृत कर दिया है?

जेपीए और सीतनिद्रा में होना – मानदंड बनाम JPQL या HQL

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

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

वेब के समाधान से एकत्रित समाधान "जेपीए और सीतनिद्रा में होना – मानदंड बनाम JPQL या HQL"

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

दोनों विश्व के सर्वश्रेष्ठ का उपयोग करने के लिए, HQL की व्यक्तित्व और संक्षिप्तता और मानदंड की गतिशील प्रकृति Querydsl का उपयोग करने पर विचार करती है ।

क्वेरीज़ जेपीए / हाइबरनेट, जेडीओ, एसक्यूएल और कलेक्शंस का समर्थन करता है।

मैं प्रश्नकर्ता के रख-रखावकर्ता हूं, इसलिए यह उत्तर पक्षपाती है।

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

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

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

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

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

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

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

मानदंड प्रश्न कम अभिव्यंजक हैं और आप आसानी से एक बहुत जटिल और अक्षम SQL उत्पन्न क्वेरी के साथ समाप्त कर सकते हैं। मैं एक बार एक बड़े एंटरप्राइज़ एप्लिकेशन में शामिल हुआ जहां मानदंड एपीआई मूलभूत क्वेरी विधि थी और यहां तक ​​कि व्यापक कोड-समीक्षा भी नहीं जानती थी कि एसक्यूएल प्रश्नों के साथ समाप्त होने वाले हम क्या कर रहे थे।

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

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

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

हमने शुरुआत में हमारे आवेदन में मुख्य मानदंड का इस्तेमाल किया था लेकिन प्रदर्शन मुद्दों के कारण एचवीएलएल के साथ इसे बदल दिया गया था।
मुख्य रूप से हम कई जटिलताओं के साथ बहुत जटिल प्रश्नों का उपयोग कर रहे हैं जो मानदंड में कई प्रश्नों की ओर जाता है लेकिन यह बहुत ही HQL में अनुकूलित है।
मामला यह है कि हम विशिष्ट ऑब्जेक्ट पर केवल कई प्रजातियों का उपयोग करते हैं और ऑब्जेक्ट को पूरा नहीं करते हैं। मानदंड के साथ समस्या भी स्ट्रिंग संयोजन थी।
मान लीजिए कि अगर आपको उपयोगकर्ता के नाम और उपनाम को HQL में प्रदर्शित करने की आवश्यकता है तो यह काफी आसान है (name || ' ' || surname) लेकिन क्रेटिया में यह संभव नहीं है।
इस पर काबू पाने के लिए हमने रिजल्ट ट्रान्स्रॉसमर्स का इस्तेमाल किया, जहां ऐसे तरीके थे जहां आवश्यक संयोजन के लिए इस तरह के संयोजन लागू किए गए थे।
आज हम मुख्य रूप से इस तरह 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(); 

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

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

स्रोत

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

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

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

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

यदि आप गहरा विश्लेषण करते हैं और कुछ परीक्षण करते हैं तो आप देखेंगे मानदंड प्रश्न बेहतर नियमित HQL

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

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

एचक्यूएल एसक्यूएल इंजेक्शन जैसी सुरक्षा चिंताओं का कारण बन सकता है।