2010-03-03 10 views
5

में सेट मैं के साथ एक मानदंड के लिए एक आदेश:,निकालें गतिशील परिणाम org.hibernate.Criteria

हालांकि जब मैं rowcount प्राप्त करना चाहते हैं असफल:

criteria.setProjection(Projections.rowCount()); 

क्योंकि वहाँ क्वेरी में एक आदेश है।

मानदंड में क्रमिक क्रम में कैसे निकालें?

मेरा मतलब है, मैं criteria.removeOrder("ID") की तरह दिख रहा हूं।

+0

हम्म ... यदि आप इसे नहीं चाहते हैं तो आप 'addOrder()' क्यों कहते हैं? –

+0

@PascalThivent अच्छा बिंदु। कभी-कभी आप एक अंतर्निहित क्रम (उदा। फैक्ट्री विधि से) के साथ एक मानदंड वस्तु वापस कर सकते हैं और आप उस पूर्वनिर्धारित क्रम को हटाना चाहेंगे। यही कारण है कि मैं इस सवाल में आया था। –

उत्तर

5

ऐसा लगता है कि आप एक गिनती प्राप्त करने के लिए आदेशित सूची प्राप्त करने के लिए किए गए मानदंड का पुन: उपयोग करने का प्रयास कर रहे हैं।

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

उपयोग

Criteria orderCriteria= session.createCriteria(Libro.class) 
           .addOrder(Order.asc("ID")); 

क्रम में सूची प्राप्त है, और

Criteria countCriteria= session.createCriteria(Libro.class) 
           .setProjection(Projections.rowCount()); 

का उपयोग मायने रखता है पाने के लिए कर सकते हैं।

दो उद्देश्यों के लिए एक ही मानदंड का उपयोग करने के लिए, आपको उपयोग के बीच राज्य को बदलना होगा। मुझे यकीन नहीं है कि ऑर्डर कैसे निकालें (या यदि आपको वास्तव में गिनती करने के लिए आवश्यकता है)। प्रक्षेपण को हटाने के लिए केवल setProjection(null) की आवश्यकता है।

0

आप एक परम के रूप में मापदंड प्राप्त करते हैं और आप इसके साथ कुछ गणना करते हैं, तो आप .Clone() यहाँ के रूप में इस्तेमाल कर सकते हैं:

private static int GetTotalRows(ICriteria criteria) 
    { 
     var countCriteria = (ICriteria)criteria.Clone(); 
     return Convert.ToInt32(countCriteria.SetProjection(Projections.RowCount()).UniqueResult()); 
    } 

अन्य समाधान ClearOrders जो सभी आदेश सूची निकाल देंगे उपयोग करने के लिए है।

private static int GetTotalRows(ICriteria criteria) 
    { 
     criteria.ClearOrders(); 
     ... 
    } 

सादर

+0

'मानदंड। क्लीयरऑर्डर()' क्या है ?? –

1

मैं भी एक ही समस्या का सामना किया था .. लेकिन मैं निम्नलिखित तरीके से हासिल की है,

आदेश मैं अभिलेखों की संख्या पूछे लागू करने से पहले,

criteria.addOrder(pageCriteria.isSortDescending() ? Order 
          .desc(pageCriteria.getSortBy()) : Order 
          .asc(pageCriteria.getSortBy())); 

pageCriteria.setTotalRecords(((Integer) criteria 
          .setProjection(Projections.rowCount()) 
          .uniqueResult()).intValue()); 
       criteria.setProjection(null); 
       criteria.setFirstResult(
         pageCriteria.getFirstRecordOfCurrentPage()) 
         .setMaxResults(pageCriteria.getRecordsPerPage()); 
       criteria 
         .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); 

उपरोक्त कोड मेरे लिए अच्छा काम करता है।

0

आप मानदंडों से आदेश को नहीं हटा सकते हैं। अंकन के लिए मेरा समाधान आदेश [] को पैरागिन करने वाली विधि की ओर पैरामीटर के रूप में पास करना है।

आपको यह केवल तभी करना है जब डीबी db2 as400 या अन्य डेटाबेस है जो select count(*) के भीतर आदेश की अनुमति नहीं देता है।

1

criteria.ClearOrders() ऑर्डर हटाने के लिए प्रदान की गई विधि NHibernate विधि है।

जावा में ऐसी कोई विधि नहीं है। और इस समस्या का मेरा समाधान Order का उपयोग कर रहा है क्योंकि पेज पैरानेशन क्वेरी फ़ंक्शन पर Criteria के साथ एक और पैरामीटर पास हो गया है।

6

अधिकांश मानदंड वास्तव में मानदंड इंपल के उदाहरण हैं। यदि आप अपने मानदंड को मानदंड Iplpl में डालते हैं और ऑर्डर के लिए इटरेटर प्राप्त करते हैं, तो आप उन्हें इस तरह से हटा सकते हैं।

Criteria criteria= session.createCriteria(Libro.class).addOrder(Order.asc("ID")); 
Iterator<Order> orderIter = ((CriteriaImpl)criteria).iterateOrderings(); 
while (orderIter.hasNext()) { 
    orderIter.next(); 
    orderIter.remove(); 
} 

Long totalRows = (Long)criteria.setProjection(Projections.rowCount()).uniqueResult(); 
+0

क्या अनुमानों के लिए कोई इटरेटर भी है? मुझे एक ही समस्या है और मैं अपने अनुमान सूची तक पहुंच बनाना चाहता हूं –