2009-10-21 5 views
8

मैं कैसे हाइबरनेट में पेजिंग लागू करते हैं (पंक्तियों की कुल संख्या हो रही)? Query ऑब्जेक्ट्स में setMaxResults और setFirstResult नामक विधियां हैं जो निश्चित रूप से सहायक हैं। लेकिन मैं कहाँ, परिणामों की कुल संख्या प्राप्त कर सकते हैं, ताकि मैं परिणामों के अंतिम पृष्ठ, और प्रिंट बातें परिणाम xxx के 250 करने के लिए 200 ऐसे रूप के लिए लिंक दिखा सकते हैं?हाइबरनेट में परिणाम पेजिंग को लागू करने

+1

पर गिनती शुरू होती है, मैं दो अन्य उत्तरों से सहमत हूं। इसके अलावा, मैं इस पोस्ट में कार्यान्वयन प्रथाओं के लिए पूछता हूं: http://stackoverflow.com/questions/1600440/java-coding-best-practices-for-reusing-part-of-a-query-to-count – KLE

उत्तर

12

आप Query.setMaxResults (int परिणाम) और Query.setFirstResult (int ऑफसेट) का उपयोग कर सकते हैं।

संपादन भी: वहाँ कोई रास्ता नहीं है पता करने के लिए कि आप कितने परिणाम प्राप्त करेंगे है। तो, सबसे पहले आपको "गिनती चुनें (*) ..." से पूछना चाहिए। थोड़ा बदसूरत, आईएमएचओ।

1

आप दो प्रश्न - एक गिनती (*) प्रकार क्वेरी कर सकते हैं, जो सस्ता होना चाहिए यदि आप एक साथ कई तालिकाओं में शामिल नहीं हो रहे हैं, और एक दूसरी क्वेरी जिसमें सीमा निर्धारित है। फिर आप जानते हैं कि कितने आइटम मौजूद हैं लेकिन केवल उन लोगों को पकड़ लें जिन्हें देखा जा रहा है।

-2

मैं व्यक्तिगत रूप से लगता है कि आप सामने के अंत में पेजिंग संभाल चाहिए। मुझे पता है कि यह प्रभावशाली नहीं है लेकिन कम से कम यह कम त्रुटि प्रवण होगा।

यदि आप गिनती (*) चीज़ का उपयोग करेंगे तो क्या होगा यदि किसी निश्चित पृष्ठ के अनुरोधों के बीच तालिका से रिकॉर्ड्स हटा दिए जाएंगे? इस तरह से कई चीजें गलत हो सकती हैं।

+0

I ऐसा नहीं लगता कि यह महत्वपूर्ण है। यदि रिकॉर्ड्स हटा दिए जाते हैं ** और ** आपको अंतिम पृष्ठ ब्राउज़ करना पड़ता है तो आपको नवीनतम मौजूदा रिकॉर्ड्स के लिए एक त्रुटि और एक लिंक प्राप्त होगा। या कुछ समान है। – flybywire

+3

सामने की तरफ पेजिंग के साथ समस्याएं हैं यदि डेटा की मात्रा निषिद्ध रूप से बड़ी है - कहें, 1 मिलियन रिकॉर्ड या कुछ। – Chii

7

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

Integer count = (Integer) session.createQuery("select count(*) from ....").uniqueResult(); 

तरह HQL में यह कर मैं आमतौर पर इस

ScrollableResults scrollable = criteria.scroll(ScrollMode.SCROLL_INSENSITIVE); 
if(scrollable.last()){//returns true if there is a resultset 
    genericDTO.setTotalCount(scrollable.getRowNumber() + 1); 
    criteria.setFirstResult(command.getStart()) 
      .setMaxResults(command.getLimit()); 
    genericDTO.setLineItems(Collections.unmodifiableList(criteria.list())); 
} 
scrollable.close(); 
return genericDTO; 
0

आप आप सिर्फ पंक्तियों की अधिकतम संख्या को setMaxResults लौटे चाहते कर सकते हैं की तरह एक डीटीओ में अपने डेटा धक्का Criteria प्रश्नों के लिए। उपलब्ध वास्तविक पंक्तियों की संख्या से अधिक इस मान को सेट करने में कोई हानि नहीं है। अन्य समाधानों की समस्या यह है कि वे मानते हैं कि रिकॉर्ड्स का ऑर्डरिंग क्वेरी के प्रत्येक दोहराना वही रहता है, और कमांड के बीच कोई बदलाव नहीं चल रहा है।

है कि यदि आप वास्तव में परिणामों में स्क्रॉल करना चाहते हैं, यह सबसे अच्छा है ScrollableResults उपयोग करने के लिए से बचने के लिए। इस ऑब्जेक्ट को पेजिंग के बीच फेंक न दें, लेकिन रिकॉर्ड्स को उसी क्रम में रखने के लिए इसका इस्तेमाल करें। ScrollableResults से रिकॉर्ड्स की संख्या का पता लगाने के लिए, आप बस अंतिम() स्थिति पर जा सकते हैं, और फिर पंक्ति संख्या प्राप्त कर सकते हैं। इस मान में 1 जोड़ने के लिए याद रखें, क्योंकि पंक्ति संख्या 0.