मानदंड एपीआई का परिचय
हाइबरनेट में डेटाबेस क्वेरी लिखने के दो तरीके हैं:
- हाइबरनेट क्वेरी भाषा
- मानदंड एपीआई
आप बहुत पहले पहले से मिल चुके हैं, यह मानदंड एपीआई से परिचित होने का समय है। यह एक बहुत शक्तिशाली उपकरण है, किसी समय यह HQL से भी अधिक लोकप्रिय था। अब यह इतना लोकप्रिय नहीं है, लेकिन कुछ कार्यों के लिए यह निश्चित रूप से एचक्यूएल से बेहतर समाधान होगा।
किसी भी मामले में, आप मानदंड एपीआई से परिचित हुए बिना हाइबरनेट नहीं सीख सकते। आइए एक छोटा सा उदाहरण लिखते हैं, और फिर हम इसका विश्लेषण करेंगे। उदाहरण के लिए, हम डेटाबेस से सभी कर्मचारियों (कर्मचारी) को अनुरोध करेंगे। यहाँ हमें क्या मिलेगा:
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Employee> critQuery = builder.createQuery(Employee.class);
Root<Employee> root = critQuery.from(Employee.class);
critQuery.select(root);
Query<Employee> query = session.createQuery(critQuery);
List<Employee> results = query.getResultList();
जटिल लग रहा है तुलना के लिए उसी HQL क्वेरी को लिखते हैं:
String hqlQuery = "from Employee";
Query<Employee> query = session.createQuery(hqlQuery);
List<Employee> results = query.getResultList();
ध्यान दें कि दोनों उदाहरणों की अंतिम दो पंक्तियाँ लगभग समान हैं: हम एक क्वेरी ऑब्जेक्ट बनाते हैं और एक सूची प्राप्त करने के लिए इसका उपयोग करते हैं। यह संकेत देता है कि बाकी पंक्तियाँ भी कुछ ऐसा ही कर रही हैं।
पहले उदाहरण की पंक्ति 3 और 4 को देखें:
Root<Employee> root = critQuery.from(Employee.class);
critQuery.select(root);
आइए उन्हें एक पंक्ति में लिखें:
critQuery.select(critQuery.from(Employee.class));
क्या यह आपको कुछ याद नहीं दिलाता? और अगर आप इसे थोड़ा अलग रंग दें:
critQuery.select(critQuery.from(Employee.class));
हाँ, यह SELECT FROM query का इतना पेचीदा निर्माण है।
मानदंड एपीआई के साथ काम करने के उदाहरण
बेहतर समझ के लिए, मैं केवल कुछ उदाहरण दूंगा।
अनुरोध 1 । 10 हजार से अधिक वेतन वाले सभी कर्मचारियों को पाएं:
critQuery.select(critQuery.from(Employee.class)).where(builder.gt(root.get("salary"), 10000));
अनुरोध 2 । 50 हजार से कम वेतन वाले सभी कर्मचारियों को पाएं:
critQuery.select(critQuery.from(Employee.class)).where(builder.lt(root.get("salary"), 50000));
अनुरोध 3 । उन सभी कर्मचारियों को प्राप्त करें जिनके कार्य शीर्षक में "परीक्षण" शब्द है:
critQuery.select(critQuery.from(Employee.class)).where(builder.like(root.get("occupation"), "%test%"));
अनुरोध 4 । 10 से 50 हजार वेतन वाले सभी कर्मचारियों को पाएं:
critQuery.select(critQuery.from(Employee.class)).where(builder.between(root.get("salary"), 10000, 50000));
अनुरोध 5 । उन सभी कर्मचारियों को प्राप्त करें जिनका नाम रिक्त है:
critQuery.select(critQuery.from(Employee.class)).where(builder.isNull(root.get("name")));
अनुरोध 6 । उन सभी कर्मचारियों को प्राप्त करें जिनका नाम रिक्त नहीं है:
critQuery.select(critQuery.from(Employee.class)).where(builder.isNotNull(root.get("name")));
क्वेरी बनाने का यह इतना मुश्किल तरीका है:
- पहले आप वस्तु प्राप्त करेंमानदंडबिल्डर.
- फिर इसका इस्तेमाल एक वस्तु बनाने के लिए करेंमानदंड प्रश्न.
- फिर आप इसमें पुर्जे जोड़ना शुरू करेंमानदंड प्रश्नऔरमानदंडबिल्डर.
इस प्रकार आप इसके लिए पैरामीटर सेट कर सकते हैं:
- चुनना
- से
- कहाँ
उपयोग भी कर रहा हैमानदंडबिल्डरआप WHERE के लिए अलग-अलग स्थितियां बना सकते हैं।
मानदंड एपीआई के साथ उन्नत कार्य
मानदंड एपीआई का उपयोग करके, आप किसी भी जटिलता की क्वेरी बना सकते हैं। और यह बहुत अच्छी खबर है। उदाहरण के लिए, आप एक जटिल WHERE क्लॉज चाहते हैं। यह कैसे करना है:
Predicate greaterThan = builder.gt(root.get("salary"), 1000);
Predicate testers = builder.like(root.get("occupation"), "test%");
critQuery.select(critQuery.from(Employee.class)).where(builder.or(greaterThan, testers));
यदि आप OR के बजाय AND लिखना चाहते हैं, तो आपको केवल अंतिम पंक्ति को बदलने की आवश्यकता है:
critQuery.select(critQuery.from(Employee.class)).where(builder.and(greaterThan, testers));
सब कुछ वास्तव में बहुत ही सरल है। मैं आपको कुछ तुलनाओं के साथ एक तालिका देता हूं:
एसक्यूएल | तरीका | पूरा रिकॉर्ड |
---|---|---|
एक <ख | लेफ्टिनेंट (ए, बी) | बिल्डर.एलटी (ए, बी) |
ए> बी | जीटी (ए, बी) | बिल्डर जीटी (ए, बी) |
ए या बी | या (ए, बी) | बिल्डर.ऑर (ए, बी) |
ए और बी | और (ए, बी) | बिल्डर.और (ए, बी) |
ए लाइक बी | जैसे (ए, बी) | बिल्डर.लाइक (ए, बी) |
बीच में (सी, डी) | बीच (ए, सी, डी) | बिल्डर.बीच (ए, सी, डी) |
एक शून्य है | शून्य है (ए) | बिल्डर.isNull (ए) |
a शून्य नहीं है | isNotNull(ए) | बिल्डर.isNotNull (ए) |
सब कुछ सरल है, है ना?
और हम क्वेरी में सॉर्टिंग कैसे जोड़ सकते हैं? बहुत सरल:
critQuery.select( critQuery.from(Employee.class) );
critQuery.where( builder.and(greaterThan, testers) );
critQuery.orderBy( builder.asc(root.get("salary"), builder.desc(root.get("joinDate") )
आप बस वस्तु पर कॉल करेंमानदंड प्रश्नorderBy() विधि और इसके लिए आवश्यक पैरामीटर पास करें।
यहां बताया गया है कि एचक्यूएल में वही क्वेरी कैसी दिखेगी। तुलना करना:
select * from Employee
where (…) and (…)
order by 'salary' asc, 'joinDate' desc
आपको केवल 3 चीजें याद रखने की जरूरत है:
- ऑब्जेक्ट पर SELECT, FROM, WHERE जैसे की-ऑपरेटर्स को कॉल किया जाता हैमानदंड प्रश्न.
- ऑब्जेक्ट पर AND, OR, DESC जैसे सहायक ऑपरेटर्स को कॉल किया जाता हैमानदंडबिल्डर.
- फ़ील्ड नाम ऑब्जेक्ट से get() के माध्यम से लिए जाते हैंजड़.
GO TO FULL VERSION