2013-07-28 4 views
6

एक पेज किए गए डेटा (पेजिनेटेड) के लिए लौटाता है, मुझे अपने मानदंडों और परिणामों के पहले पृष्ठ से मेल खाने वाले रिकॉर्ड की कुल संख्या वापस करने की आवश्यकता होती है। यह उपयोगकर्ताओं के लिए जानकारी प्रदर्शित करने और पृष्ठों की कुल संख्या की गणना करने के लिए उपयोगी है (क्लाइंट पर)।जेपीए मानदंड एक पेज और कुल

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

क्या इन दो प्रश्नों को डेटाबेस में एक कॉल में जोड़ा जा सकता है?

गिनती:

CriteriaBuilder cb = em.getCriteriaBuilder(); 
    CriteriaQuery<Long> cq = cb.createQuery(Long.class); 
    Root<VersionJpa> r = cq.from(VersionJpa.class); 
    Predicate p = cb.conjunction(); 
    p = // some filtering code define by caller 
    cq.where(p); 
    cq.select(cb.count(r)); 
    TypedQuery<Long> tq = em.createQuery(cq); 
    return tq.getSingleResult().intValue(); 

पेज:

CriteriaBuilder cb = em.getCriteriaBuilder(); 
    CriteriaQuery<VersionJpa> cq = cb.createQuery(VersionJpa.class); 
    Root<VersionJpa> root = cq.from(VersionJpa.class); 
    Predicate p = cb.conjunction(); 
    p = // same filtering code as in the count above 
    cq.where(p); 
    TypedQuery<VersionJpa> tq = em.createQuery(cq); 
    // paginatong 
    tq.setFirstResults(first); // from caller 
    tq.setMaxResults(max);  // from caller 
    return tq.getResultList(); 

उत्तर

2

भी मान कि एक कुशल क्वेरी कि दोनों रिकॉर्ड गिनती और पृष्ठवार रिकॉर्ड खुद को पुन: प्राप्त करता मौजूद है, तो आप एक अतिरिक्त प्रदर्शन करने के लिए की आवश्यकता होगी उपयोगकर्ता द्वारा उपयोग किए जाने वाले प्रत्येक पृष्ठ के लिए डीबी पर कॉल करें। और यह पहले पृष्ठ तक पहुंच के दौरान हासिल किए गए प्रदर्शन लाभ को नगण्य बना देगा।

मेरा मतलब है निम्नलिखित: प्रथम पृष्ठ तक पहुँचने के लिए, आप की जरूरत:

  1. पृष्ठांकन
  2. पेज 1
के लिए पृष्ठांकन के साथ फ़िल्टर्ड आइटम के बिना फ़िल्टर्ड वस्तुओं की कुल गिनती

अन्य पृष्ठों तक पहुंचने के लिए, आपको अब गिनती क्वेरी की आवश्यकता नहीं है। आपको केवल पृष्ठ x के लिए फ़िल्टर किए गए आइटमों की आवश्यकता है।

एन पृष्ठों को प्रकट करने के बाद, आप जिस ऑप्टिमाइज़ेशन की तलाश कर रहे हैं उसका उपयोग करके भी, आपने गैर-अनुकूलित संस्करण की एन + 1 कॉल के बजाय एन कॉल किया होगा। तो, मैं इस बारे में सोचने में बहुत अधिक समय नहीं लगाऊंगा।

आपको केवल अपने क्रियान्वयन में सावधान रहना होगा, जब आवश्यक नहीं हो तो रिकॉर्ड गिनती न करें: उपयोगकर्ता को फ़िल्टरिंग बदलने के बाद ही इसकी आवश्यकता होती है।

+1

@perissf बहुत अच्छा बिंदु धन्यवाद। ग्राहक स्टेटलेस है इसलिए प्रत्येक कॉल पहला हो सकता है इसलिए मुझे सभी प्रतिक्रियाओं पर कुल गिनती प्रदान करने की आवश्यकता है। डेटाबेस लगातार बदल रहा है और कॉल से कॉल करने और पृष्ठ से पृष्ठ (बढ़ने) तक मेरा पूरा परिवर्तन। संयुक्त मामले बनाना मेरे मामले में उपयोगी होगा। यह 2 एन से सिर्फ एन तक डीबी कॉल को कम करेगा। अंकन करने के लिए मेरी समझ डीबी को सभी वस्तुओं को प्राप्त करना है ताकि गिनती लगभग लागत मुक्त होनी चाहिए। – Gadi

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