2.1 क्वेरी कक्षाओं का परिचय

वैसे, एक अन्य महत्वपूर्ण बिंदु क्वेरी सहायक वर्ग है। आप इसे इस उदाहरण में देख सकते हैं:

public List<Employee> getAllEmployes() {
    try (Session session = sessionFactory.openSession()) {
            Query<Employee> query = session.createQuery("from Employee", Employee.class);
            return query.list();
    }
}

वास्तव में, क्वेरी एक इंटरफ़ेस है और इसमें विभिन्न मामलों के लिए कई कार्यान्वयन हैं। लेकिन सरलता के लिए, मैं इसे एक वर्ग कहता रहूंगा। यह, मान लीजिए, एक व्यापक अर्थ में एक वर्ग है - ओओपी के संदर्भ में।

टिप्पणी। दो वर्ग हुआ करते थे:

  • क्वेरी का वर्णन करने के लिए क्वेरी ।
  • TypedQuery एक ज्ञात प्रकार के साथ एक क्वेरी का वर्णन करने के लिए।

पहली बार दिखाई दिया जब हाइबरनेट पहले से मौजूद था, और अभी तक कोई जेनरिक नहीं था। फिर, JDK 5 के जारी होने के बाद, हाइबरनेट - TypedQuery में एक और वर्ग जोड़ा गया, जो पहले से ही क्वेरी परिणाम के टाइपिंग का समर्थन करता है।

लेकिन, जहां तक ​​​​मुझे याद है, हाइबरनेट के 5 वें संस्करण से शुरू होकर, केवल एक टाइप की गई कक्षा बची थी, और अब इसे क्वेरी कहा जाता है।

क्वेरी बनाने का मानक तरीका है:


Query<Employee> query = session.createQuery("from Employee", Employee.class);

आपने क्वेरी ऑब्जेक्ट बनाना सीख लिया है, लेकिन आप इन प्रश्नों को कैसे निष्पादित करते हैं?

यहां यह और भी सरल है - हम केवल क्वेरी ऑब्जेक्ट पर सूची () विधि कहते हैं:


Query<Employee> query = session.createQuery("from Employee", Employee.class);
List<Employee> resultLіst = query.list();

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

वैसे, यदि क्वेरी का अर्थ है कि परिणाम एक ही परिणाम में होगा, तो क्वेरी को कॉल करने के लिए UniqueResult() विधि का उपयोग करना आसान है ।


Query<Employee> query = session.createQuery("from Employee where id = 1", Employee.class);
Employee result = query.uniqueResult();

UniqueResult() मेथड में JPA समानार्थक शब्द है, singleResult() मेथड । इसे जेपीए मानक के साथ हाइबरनेट की अनुकूलता के लिए पेश किया गया था। वह ठीक वैसा ही करता है।

2.2 क्वेरी वर्ग के तरीके

वास्तव में, क्वेरी वर्ग में कई अलग-अलग विधियाँ हैं। नीचे मैं उनमें से तीन और के बारे में बात करूंगा।

पहली धारा () विधि है । और इसका जेपीए समानार्थी getResultStream() है ।

ये दोनों विधियाँ सूची के बजाय डेटा की एक धारा लौटाती हैं। यह दृष्टिकोण बहुत कुशल हो सकता है जब आपको एक ही बार में क्वेरी के परिणामस्वरूप प्राप्त सभी वस्तुओं की आवश्यकता नहीं होती है। या ऐसी संभावना है कि उनमें से केवल पहले का ही उपयोग किया जाएगा।

उदाहरण:


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
Stream<Employee> stream = query.stream();

दूसरी विधि एक्जीक्यूटअपडेट () विधि है । आप एक क्वेरी लिख सकते हैं जो डेटाबेस में कुछ बदल देगी। इस मामले में, यह आवश्यक है कि डेटाबेस तक पहुँचने के दौरान हाइबरनेट केवल-पढ़ने के लिए लेनदेन का उपयोग न करे।

अनुरोध उदाहरण: हमने सभी उपयोगकर्ताओं के स्तर को 1 से बढ़ाने का निर्णय लिया।


Query<User> query = session.createQuery("update User set level=level+1", User.class);
int count = query.executeUpdate();

ExecuteUpdate () विधि उन पंक्तियों की संख्या वापस कर देगी जिन्हें वास्तव में संशोधित किया गया है।

और अंत में तीसरी विधि है स्क्रॉल() । हम आपको इसके बारे में थोड़ा और बताएंगे।

2.3 स्क्रॉल क्लास के तरीके

यह विधि कुछ हद तक स्ट्रीम () विधि के समान है । केवल यह आपको परिणामों को निकाले बिना परिणामों की सूची में आगे बढ़ने की अनुमति देता है। यानी, आप किसी क्वेरी को निष्पादित कर सकते हैं, फिर उसे परिणाम की दसवीं पंक्ति तक स्क्रॉल कर सकते हैं और वहां से डेटा पढ़ना शुरू कर सकते हैं।

इतना उन्नत पुनरावर्तक।


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();

स्क्रॉल करने योग्य परिणाम ऑब्जेक्ट में निम्न विधियाँ हैं:

तरीका विवरण
आर प्राप्त करें () वर्तमान तत्व लौटाता है
अगला() सूचक को अगले तत्व पर ले जाता है
पहले का() पॉइंटर को पिछले एलिमेंट पर ले जाता है
स्क्रॉल (पूर्णांक आकार) आकार रेखाओं द्वारा आगे स्क्रॉल करें
स्थिति (int स्थिति) तत्व स्थिति संख्या को वर्तमान तत्व बनाता है
अंतिम() वर्तमान तत्व अब अंतिम है
पहला() वर्तमान तत्व अब पहला है
getRowNumber () वर्तमान पंक्ति संख्या लौटाता है
सेटरोनंबर () वर्तमान पंक्ति संख्या सेट करता है

मान लीजिए कि आपने एक क्वेरी चलाई और आप अंतिम तत्व प्राप्त करना चाहते हैं। यह कैसे करना है:


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();
scroll.last();
Employee lastEmployee = scroll.get();