समूहीकरण और एकत्रीकरण कार्य
आपने पहले ही पता लगा लिया है कि मानदंड एपीआई के लिए सरल अनुरोध कैसे करें। आइए देखें कि अधिक जटिल प्रश्न कैसे बनाए जाते हैं।
उदाहरण के लिए, हम किसी कंपनी में कर्मचारियों की संख्या निर्धारित करने के लिए एक प्रश्न लिखना चाहते हैं। यहां यह एचक्यूएल में कैसा दिखेगा:
select count(*) from Employee
और इस तरह मानदंड एपीआई पर:
CriteriaQuery<Long> critQuery = builder.createQuery(Long.class);
critQuery.select(builder.count(critQuery.from(Employee.class)));
पूरा जावा कोड इस तरह दिखेगा:
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Long> critQuery = builder.createQuery(Long.class);
critQuery.select(builder.count(critQuery.from(Employee.class)));
Query<Long> query = session.createQuery(critQuery);
Long count = query.getSingleResult();
और यह एचक्यूएल का उपयोग कर वही है:
String hqlQuery = "select count(*) from Employee";
Query<Long> query = session.createQuery(hqlQuery);
Long count = query.getSingleResult();
अब आइए कंपनी में औसत वेतन की गणना करने का प्रयास करें। एचक्यूएल क्वेरी इस तरह दिखेगी:
select avg(salary) from Employee
और इस तरह मानदंड एपीआई पर:
CriteriaQuery<Double> critQuery = builder.createQuery(Double.class);
critQuery.select(builder.avg( critQuery.from(Employee.class).get("salary")));
पूरा जावा कोड इस तरह दिखेगा:
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Double> critQuery = builder.createQuery(Double.class);
critQuery.select(builder.avg( critQuery.from(Employee.class).get("salary")));
Query<Double> query = session.createQuery(critQuery);
Double avgSalary = query.getSingleResult();
मानदंड अद्यतन
तालिका को संशोधित करना उतना ही आसान है जितना इससे डेटा प्राप्त करना। ऐसा करने के लिए, मानदंडबिल्डर की एक विशेष विधि है - createCriteriaUpdate() , जो एक वस्तु बनाता हैमानदंड अद्यतन <टी>जो डेटाबेस में संस्थाओं को अद्यतन करता है।
10 हजार से कम पाने वाले कर्मचारियों का वेतन बढ़ाया जाए। यह एचक्यूएल क्वेरी इस तरह दिखेगी:
update Employee set salary = salary+20000 where salary<=10000
और मानदंड API पर यह इस प्रकार दिखाई देगा:
CriteriaUpdate<Employee> criteriaUpdate = builder.createCriteriaUpdate(Employee.class);
Root<Employee> root = criteriaUpdate.from(Employee.class);
criteriaUpdate.set("salary", "salary+20000");
criteriaUpdate.where(builder.lt(root.get("salary"), 10000));
Transaction transaction = session.beginTransaction();
session.createQuery(criteriaUpdate).executeUpdate();
transaction.commit();
मानदंड हटाएं
और रिकॉर्ड को हटाना उन्हें बदलने से भी आसान है। ऐसा करने के लिए, एक विशेष विधि createCriteriaDelete () है , जो एक वस्तु बनाता हैमानदंड हटाएं <टी>.
आइए उन सभी कर्मचारियों को काट दें जिनकी कोई कीमत नहीं है: उनका वेतन 10 हजार से कम है। यह एचक्यूएल क्वेरी इस तरह दिखेगी:
delete from Employee where salary<=10000
और मानदंड API पर यह इस प्रकार दिखाई देगा:
CriteriaDelete<Employee> criteriaDelete = builder.createCriteriaDelete(Employee.class);
Root<Employee> root = criteriaDelete.from(Employee.class);
criteriaDelete.where(builder.lt(root.get("salary"), 10000));
Transaction transaction = session.beginTransaction();
session.createQuery(criteriaDelete).executeUpdate();
transaction.commit();
मानदंड एपीआई के लाभ
तो मानदंड एपीआई का क्या फायदा है? प्रश्न बोझिल हैं, एचक्यूएल निश्चित रूप से अधिक कॉम्पैक्ट होगा।
सबसे पहले, अगर आपको पैरामीटर पास करने की आवश्यकता है तो एचक्यूएल प्रश्न इतने कम नहीं हैं। तुलना करना:
हम 10 हजार से कम वेतन वाले कर्मचारियों की संख्या पर विचार करते हैं |
---|
एचक्यूएल |
|
मानदंड एपीआई |
|
दूसरे, अक्सर ऐसी स्थिति होती है जब क्वेरी को गतिशील रूप से बनाने की आवश्यकता होती है। उदाहरण के लिए, आपके पास कर्मचारियों, अपार्टमेंट्स और कुछ भी फ़िल्टर करने वाला एक वेब पेज है। और अगर कुछ पैरामीटर उपयोगकर्ता के लिए महत्वपूर्ण नहीं है, तो वह बस इसे इंगित नहीं करता है। तदनुसार, इसके बजाय सर्वर को नल दिया जाता है।
यहां आपका कार्य है: एक निश्चित पेशे (व्यवसाय), वेतन (वेतन) और रोजगार के वर्ष (YEAR (join_date)) वाले कर्मचारियों का चयन करना। लेकिन यदि कोई पैरामीटर मान शून्य है, तो इसे फ़िल्टर में उपयोग न करें।
फिर एचक्यूएल क्वेरी कुछ इस तरह दिखाई देगी:
from Employee
where (occupation = :ocp)
and (salary = :sal)
and ( YEAR(join_date) = :jny)
लेकिन यह सही ढंग से काम नहीं करेगा, क्योंकि हम चाहते हैं कि यदि "जेनी" पैरामीटर शून्य था, तो अनुरोध इस तरह दिखेगा:
from Employee
where (occupation = :ocp)
and (salary = :sal)
हम शून्य के लिए पैरामीटर की जाँच करके अनुरोध को फिर से लिखने का प्रयास कर सकते हैं, फिर हमें कुछ इस तरह मिलेगा:
from Employee
where (occupation = :ocp or :ocp is null)
and (salary = :sal or :sal is null)
and ( YEAR(join_date)= :jny or :jny is null)
देखें कि वास्तविकता और अधिक जटिल कैसे हो जाती है? हकीकत अक्सर ऐसा ही होता है :)
लेकिन फ़िल्टर और भी जटिल हो सकता है। उन उपयोगकर्ताओं को कैसे खोजा जाए जिनके पास "buy" शब्द वाले कार्य हैं? या जिन उपयोगकर्ताओं के पास अतिदेय कार्य हैं?
from Employee
where (occupation = :ocp)
and (salary = :sal)
and (YEAR(join_date) = :jny)
and (tasks.name like '%buy%')
and (tasks.deadline < curdate())
यदि आप ऐसी क्वेरी में कहीं लिखते हैं या शून्य हैं , तो यह तालिकाओं के बीच जुड़ाव को रद्द नहीं करेगा।
तो व्यवहार में, जब आप कई तालिकाओं के क्षेत्र में कोई जटिल फ़िल्टर करते हैं, तो मानदंड एपीआई आपकी सहायता कर सकता है। तो यह जाता है।
अधिक विवरण आधिकारिक दस्तावेज में पाया जा सकता है ।