समूहीकरण आणि एकत्रीकरण कार्ये

निकष API ला साध्या विनंत्या कशा करायच्या हे तुम्ही आधीच शोधून काढले आहे. चला अधिक जटिल प्रश्न कसे बनवायचे ते पाहू.

उदाहरणार्थ, आम्हाला कंपनीतील कर्मचार्‍यांची संख्या निर्धारित करण्यासाठी एक क्वेरी लिहायची आहे. हे HQL मध्ये कसे दिसेल ते येथे आहे:

select count(*) from Employee

आणि निकष API वर याप्रमाणे:

CriteriaQuery<Long> critQuery = builder.createQuery(Long.class);
critQuery.select(builder.count(critQuery.from(Employee.class)));

संपूर्ण Java कोड यासारखा दिसेल:

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();

आणि हे HQL वापरून समान आहे:

String hqlQuery = "select count(*) from Employee";

Query<Long> query = session.createQuery(hqlQuery);
Long count = query.getSingleResult();

आता कंपनीतील सरासरी पगाराची गणना करण्याचा प्रयत्न करूया. HQL क्वेरी असे दिसेल:

select avg(salary) from Employee

आणि निकष API वर याप्रमाणे:

CriteriaQuery<Double> critQuery = builder.createQuery(Double.class);
critQuery.select(builder.avg( critQuery.from(Employee.class).get("salary")));

संपूर्ण Java कोड यासारखा दिसेल:

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();

मापदंड अद्यतन

सारणी बदलणे हे त्यातून डेटा मिळवण्याइतके सोपे आहे. हे करण्यासाठी, CriteriaBuilder कडे एक विशेष पद्धत आहे - createCriteriaUpdate() , जी एक ऑब्जेक्ट तयार करते.मापदंड अद्यतन<T>जे डेटाबेसमधील घटक अद्यतनित करते.

10 हजारांपेक्षा कमी वेतन घेणाऱ्या कर्मचाऱ्यांचे वेतन वाढवू. ही HQL क्वेरी कशी दिसेल ते येथे आहे:

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() , जी ऑब्जेक्ट तयार करतेनिकष हटवा<T>.

ज्यांचे कोणतेही मूल्य नाही अशा सर्व कर्मचार्‍यांची कपात करूया: त्यांचे वेतन 10 हजारांपेक्षा कमी आहे. ही HQL क्वेरी कशी दिसेल ते येथे आहे:

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();

निकष API चे फायदे

मग क्रायटेरिया API चा फायदा काय? प्रश्न अवजड आहेत, HQL नक्कीच अधिक संक्षिप्त असेल.

प्रथम, जर तुम्हाला त्यांना पॅरामीटर्स पाठवायचे असतील तर HQL क्वेरी इतक्या लहान नसतात. तुलना करा:

आम्ही 10 हजारांपेक्षा कमी पगार असलेल्या कर्मचाऱ्यांची संख्या मानतो
HQL
String hqlQuery = "from Employee where salary < :sal";
Query<Employee> query = session.createQuery(hqlQuery);
query.setParametr("sal", 10000);
List<Employee> results = query.getResultList();
निकष API
CriteriaBuilder builder = session.getCriteriaBuilder();
critQuery.select(critQuery.from(Employee.class)).where(builder.lt(root.get("salary"), 10000));
Query<Employee> query = session.createQuery(critQuery);
List<Employee> results = query.getResultList();

दुसरे म्हणजे, बर्‍याचदा अशी परिस्थिती असते जेव्हा क्वेरी डायनॅमिकपणे तयार करणे आवश्यक असते. उदाहरणार्थ, तुमच्याकडे कर्मचारी, अपार्टमेंट आणि काहीही फिल्टर करणारे वेब पृष्ठ आहे. आणि जर काही पॅरामीटर वापरकर्त्यासाठी महत्वाचे नसेल तर तो फक्त ते सूचित करत नाही. त्यानुसार, नल त्याऐवजी सर्व्हरला पास केले जाते.

हे तुमचे कार्य आहे: विशिष्ट व्यवसाय (व्यवसाय), पगार (पगार) आणि नोकरीचे वर्ष (YEAR (join_date)) असलेले कर्मचारी निवडणे. परंतु कोणतेही पॅरामीटर मूल्य शून्य असल्यास, ते फिल्टरमध्ये वापरू नका.

मग HQL क्वेरी यासारखे काहीतरी दिसेल:

from Employee
where (occupation = :ocp)
   	and (salary = :sal)
   	and ( YEAR(join_date) = :jny)

परंतु ते योग्यरित्या कार्य करणार नाही, कारण आम्हाला हवे आहे की जर "jny" पॅरामीटर शून्य असेल, तर विनंती यासारखी दिसेल:

from Employee
where (occupation = :ocp)
   	and (salary = :sal)

आम्ही null साठी पॅरामीटर तपासून विनंती पुन्हा लिहिण्याचा प्रयत्न करू शकतो, नंतर आम्हाला असे काहीतरी मिळेल:

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)

वास्तव अधिक क्लिष्ट कसे होते ते पहा? वास्तव अनेकदा असे असते :)

पण फिल्टर आणखी क्लिष्ट असू शकते. ज्या वापरकर्त्यांना त्यांच्यामध्ये "खरेदी" शब्दासह कार्ये आहेत त्यांच्यासाठी कसे शोधायचे? किंवा ज्या वापरकर्त्यांची कामे थकीत आहेत?

from Employee
where (occupation = :ocp)
   	and (salary = :sal)
   	and (YEAR(join_date) = :jny)
   	and (tasks.name like '%buy%')
   	and (tasks.deadline < curdate())

तुम्ही अशा क्वेरीमध्ये कुठेतरी लिहिल्यास किंवा शून्य असल्यास , हे टेबलमधील जोडणी रद्द करणार नाही.

म्हणून व्यवहारात, जेव्हा तुम्ही अनेक टेबल्सच्या फील्डवर कोणतेही जटिल फिल्टर करता, तेव्हा क्रायटेरिया API तुम्हाला मदत करू शकते. हे असे आहे.

अधिक तपशील अधिकृत कागदपत्रांमध्ये आढळू शकतात .