हम हाइबरनेट (~ 2009) के पुराने संस्करणों का उपयोग करके पंक्तियों को कैसे गिनते हैं?


242

उदाहरण के लिए, यदि हमारे पास एक टेबल बुक्स है, तो हम हाइबरनेट के साथ कुल बुक रिकॉर्ड कैसे गिनेंगे?

जवाबों:


310

हाइबरनेट के पुराने संस्करणों के लिए (<5.2):

वर्ग का नाम मानते हुए पुस्तक है:

return (Number) session.createCriteria("Book")
                  .setProjection(Projections.rowCount())
                  .uniqueResult();

यह कम से कम एक है Number, सबसे अधिक संभावना है Long


10
यह लंबा लौटता है।
dj_segfault

10
जैसा कि @Salandur सुझाव देता है, "यह कम से कम एक संख्या है", और संख्या प्रकार में "intValue ()", "longValue ()" विधियां हैं, इसलिए हम आसानी से इच्छित इच्छित प्रकार प्राप्त कर सकते हैं: ((संख्या) मानदंड ।uniqueResult ())। इंटल्यू ()
जेरी तियान

5
यदि मानदंड विधि बनाने के लिए स्ट्रिंग पैरामीटर का उपयोग करते हुए इकाई मैपिंग नहीं हो पा रही है, session.createCriteria (Book.class) का भी उपयोग किया जा सकता है
एम

5
@MontyBongo ने कहा, मुझे वास्तव में इस तरह कक्षा का उल्लेख करना था: return (Number) session.createCriteria(Book.class).setProjection(Projections.rowCount()).uniqueResult();
bcmoney

2
तब आपको तर्कसंगत डेटाबेस का उपयोग नहीं करना चाहिए;)। लंबे समय का अधिकतम मूल्य 9,223372037 × 10 which है, जो कि है
सलंदुर

102

जावा में मुझे आम तौर पर इंट वापस जाने और इस फॉर्म का उपयोग करने की आवश्यकता होती है:

int count = ((Long)getSession().createQuery("select count(*) from Book").uniqueResult()).intValue();

1
इस प्रश्न का स्वीकृत उत्तर मेरे लिए काम नहीं आया, लेकिन आपका था। धन्यवाद!
जेसन निकोल्स

क्वेरी की गिनती प्राप्त करने का यह सबसे तेज़ और सस्ता तरीका है? मेरा मतलब है हाइबरनेट-वार
kommradHomer

57
अगर हम SQL को कोडिंग करते हैं, तो ORM का उपयोग करने का क्या मतलब है?
थर्मेज़

यह मेरी मुख्य चिंता है (एचक्यूएल के बजाय एसक्यूएल का उपयोग करना)। मुझे बाईं ओर से जुड़ने के बाद आने वाली पंक्तियों की संख्या की गणना करने के लिए नेस्टेड सिलेक्ट का उपयोग करना होगा (मुझे हाइबरनेट में बाईं बाहरी जॉइन का उचित कार्यान्वयन नहीं मिला)।
प्रमोद

15
सबसे पहले, यह समाधान SQL का उपयोग नहीं करता है, यह HQL है। और E (ई से 'सेलेक्ट काउंट (e) के बजाय count (*) का उपयोग करना या मापदंड @EmbeddedId और डेटाबेस के साथ काम करता है जो tuple count (उदा। MySQL) का समर्थन नहीं करता है, जहां' select ((a, b) जैसे प्रश्न आते हैं। ) से तालिका 1 'काम नहीं करता है)।
ब्रूनो जेसीएम

43

यहाँ आधिकारिक हाइबरनेट डॉक्स हमें इस बारे में बताते हैं:

आप उन्हें वापस किए बिना क्वेरी परिणामों की संख्या की गणना कर सकते हैं:

( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue()

हालांकि, यह हमेशा Integerउदाहरण नहीं देता है, इसलिए java.lang.Numberसुरक्षा के लिए उपयोग करना बेहतर है ।


1
एक जवाब के लिए +1 जो हाइबरनेट टीम को अनुशंसित विधि देता है।
टॉम

3
मेरे लिए इसने "java.lang.ClassCastException: java.lang.Long को java.lang.Integer" में डाला नहीं जा सकता है, लेकिन इसके बजाय लंबे समय तक काम करना ...
rogerdpack

2
@rogerdpack ऐसा इसलिए है क्योंकि हाइबरनेट ने 3.5 में लौटे प्रकार को लॉन्ग में बदल दिया है: community.jboss.org/wiki/HibernateCoreMigrationGuide35
मशीनरी

1
गिनती समारोह के लिए वापसी प्रकार org.hibernate.dialect.function.StandardAnsiSqlAggregationFunctions.CountFunction( StandardBasicTypes.Long ) में पाया जा सकता है
गुइल्यूम हस्टा

12

तुम कोशिश कर सकते हो count(*)

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

डेटाबेस में तालिका - नहीं Booksनाम कहां है class


खेद है, लेकिन जावा और हाइबरनेट के साथ काम नहीं कर रहा है :( (मैंने इंटर्गर के साथ इंट की जगह ली, क्योंकि यह टाइप कास्टिंग के लिए जावा में है।)
शिल्पकार

यह काम करना चाहिए - int के बजाय Integer के साथ? आपको एचक्यूएल में क्लास का नाम रखने की जरूरत है, न कि टेबल का नाम - केवल एक चीज है जो मैं सोच सकता हूं कि गलत हो सकती है
जॉन स्पीक्स

1
मेरा मानना ​​है कि नीचे का पद सीधे कोर हाइबरनेट सिद्धांतों के अनुरूप है।
मैट सिडिंजर

मेरे लिए यह जावा और हाइबरनेट के साथ काम नहीं कर रहा है। इसके बजाय क्या करना है?
rParvathi

6

यदि आप हाइबरनेट 5+ का उपयोग कर रहे हैं, तो क्वेरी को संशोधित किया जाएगा

Long count = session.createQuery("select count(1) from  Book")
                    .getSingleResult();

या यदि आपको TypedQuery की आवश्यकता है

Long count = session.createQuery("select count(1) from  Book",Long.class)
                        .getSingleResult();

6
Long count = (Long) session.createQuery("select count(*) from  Book").uniqueResult();

यह लंबे समय से गिनती be``` चाहिए = (लांग) session.createQuery ( "चयन गिनती (1) पुस्तक से") uniqueResult (); `` `यह प्रदर्शन में सुधार होगा।
rajadilipkolli

1

यह हाइबरनेट 4 (परीक्षण) में काम करता है।

String hql="select count(*) from  Book";
Query query= getCurrentSession().createQuery(hql);
Long count=(Long) query.uniqueResult();
return count;

जहां getCurrentSession () है:

@Autowired
private SessionFactory sessionFactory;


private Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}

1

यह बहुत आसान है, बस निम्नलिखित JPQL क्वेरी चलाएँ:

int count = (
(Number)
    entityManager
    .createQuery(
        "select count(b) " +
        "from Book b")
    .getSingleResult()
).intValue();

हम जिस कारण से कास्टिंग कर रहे हैं, Numberवह यह है कि कुछ डेटाबेस वापस आएंगे Longजबकि अन्य वापस आएंगे BigInteger, इसलिए पोर्टेबिलिटी के लिए आप कास्टिंग से बेहतर हैं Numberऔर एक intया एक longके आधार पर, आप कितनी पंक्तियों की गिनती के आधार पर उम्मीद कर रहे हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.