2011-08-31 9 views
17

हाइबरनेट मानदंड समर्थन डीबी से लौटाए गए परिणामों को सीमित करने के लिए setMaxResults() विधि प्रदान करता है।हाइबरनेट मानदंड सीमा तंत्र?

मुझे उनके दस्तावेज़ में इसका कोई जवाब नहीं मिल रहा है - यह कैसे कार्यान्वित किया जाता है? क्या यह पूरे परिणाम सेट के लिए पूछताछ कर रहा है और फिर केवल अनुरोध संख्या लौटा रहा है? या यह वास्तव में डेटाबेस अंत में क्वेरी को सीमित कर रहा है (मुझे LS कीवर्ड को mySql में लगता है)।

यह महत्वपूर्ण है क्योंकि यदि कोई प्रश्न संभावित रूप से कई सारे परिणाम लौटा सकता है, तो मुझे वास्तव में यह जानने की आवश्यकता है कि setMaxResults() डेटाबेस में सभी पंक्तियों (जो खराब होगा) के लिए अभी भी पूछताछ करेगा।

इसके अलावा - यदि यह डेटाबेस अंत में पंक्तियों की संख्या को वास्तव में सीमित कर रहा है, तो यह इस क्रॉस-डीबी को कैसे प्राप्त कर रहा है (क्योंकि मुझे नहीं लगता कि प्रत्येक rdbms मेरी एसक्यूएल जैसी LIMIT कार्यक्षमता का समर्थन करता है)।

उत्तर

0

एचक्यूएल एसक्यूएल में एक क्वेरी के अंदर एक सीमा का समर्थन नहीं करता है, केवल setMaxResults() जो आपको भी मिला।

यह पता लगाने के लिए कि क्या यह setMaxResults() को एक LIMIT क्वेरी में परिवर्तित करता है, तो आप अपना SQL लॉगिंग चालू कर सकते हैं।

11

हाइबरनेट क्वेरी द्वारा लौटाए गए परिणामों को सीमित करने के लिए डेटाबेस से पूछता है। यह बोलीभाषा के माध्यम से करता है, जो ऐसा करने के लिए डेटाबेस-विशिष्ट तंत्र का उपयोग करता है (इसलिए SQL सर्वर के लिए यह "तालिका से शीर्ष एन * का चयन करें" जैसा कुछ भी करेगा, ओरेकल तालिका से "चयन * करेगा जहां rownum < n ", MySQL" टेबल सीमा एन से चुनें "आदि करेगा)। फिर यह वापस आता है कि डेटाबेस क्या देता है।

+0

इंटरस्टिंग। तो, आप क्यों सोचते हैं, क्या उन्होंने एचक्यूएल का उपयोग सीमित करने का कोई तरीका नहीं दिया है, यदि वे एक मानदंड सेट मैक्स रेसल्ट्स को निर्दिष्ट बोली में परिवर्तित करने में सक्षम हैं? – john

+0

http://stackoverflow.com/questions/1239723/how-do-you-do-a-limit-query-in-hql – Ritesh

+0

में एक नज़र डालें, यह कुछ स्पष्टता प्रदान कर सकता है: http://stackoverflow.com/questions/1239723/कैसे करते हैं-आप करते हैं एक सीमा-क्वेरी में HQL।मेरी समझ यह है कि यह एचक्यूएल भाग डेटाबेस अज्ञेय रखने के लिए उबलता है, बोलीभाषा विशिष्ट विशेषताओं को अतिरिक्त विधि कॉल के माध्यम से किया जाता है जैसे setMaxResults – brent777

2

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

वे इसके लिए बोली विशिष्ट विशिष्ट एसक्यूएल का उपयोग करते हैं, उदाहरण के लिए OScle में MySQL, ROWNUM में LIMIT। आपका इकाई प्रबंधक उस बोलीभाषा से अवगत है जिसका आप उपयोग कर रहे हैं, इसलिए यह आसान है।

आखिरकार यदि आप वास्तव में यह जांचना चाहते हैं कि इस क्वेरी के लिए एसक्यूएल हाइबरनेट क्या उत्पादन कर रहा है, तो बस जब आप अपना इकाई प्रबंधक/कारखाना बनाते हैं तो "show_sql" प्रॉपर्टी को सत्य पर सेट करें और यह कंसोल पर चल रहे सभी एसक्यूएल को थूकता है ।

5

कक्षा org.hibernate.dialect.Dialect में supportsLimit() नामक एक विधि शामिल है। यदि बोलीभाषा उप-वर्ग इस विधि को ओवरराइड करते हैं, तो वे अपने डेटाबेस स्वाद के मूल रूप से मूल रूप से पंक्ति सीमा हैंडलिंग को कार्यान्वित कर सकते हैं। आप देख सकते हैं कि इस कोड को org.hibernate.loader.Loader में कहां से कॉल किया गया है जिसमें prepareQueryStatement शीर्षक वाली विधि है, बस शब्द को खोजें।

हालांकि, यदि बोली इस सुविधा का समर्थन नहीं करती है, तो ResultSet इटरेटर के खिलाफ एक कठिन जांच है जो सुनिश्चित करता है कि सीमा समाप्त होने पर जावा ऑब्जेक्ट (इकाई) परिणाम बनाए जा रहे हैं। यह कोड Loader में भी स्थित है।