தொகுத்தல் மற்றும் திரட்டுதல் செயல்பாடுகள்

Criteria API க்கு எளிய கோரிக்கைகளை எவ்வாறு செய்வது என்பதை நீங்கள் ஏற்கனவே கண்டுபிடித்துள்ளீர்கள். மிகவும் சிக்கலான கேள்விகளை எவ்வாறு செய்வது என்று பார்ப்போம்.

எடுத்துக்காட்டாக, ஒரு நிறுவனத்தில் உள்ள ஊழியர்களின் எண்ணிக்கையைத் தீர்மானிக்க வினவலை எழுத விரும்புகிறோம். HQL இல் இது எப்படி இருக்கும் என்பது இங்கே:

select count(*) from Employee

Criteria API இல் இது போன்றது:

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

இது HQL ஐப் பயன்படுத்துகிறது:

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

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

இப்போது நிறுவனத்தில் சராசரி சம்பளத்தை கணக்கிட முயற்சிப்போம். HQL வினவல் இப்படி இருக்கும்:

select avg(salary) from Employee

Criteria API இல் இது போன்றது:

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

அளவுகோல் மேம்படுத்தல்

அட்டவணையை மாற்றுவது அதிலிருந்து தரவைப் பெறுவது போல் எளிதானது. இதைச் செய்ய, 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();

Criteria API இன் நன்மைகள்

எனவே Criteria 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)

பூஜ்யத்திற்கான அளவுருவைச் சரிபார்ப்பதன் மூலம் கோரிக்கையை மீண்டும் எழுத முயற்சி செய்யலாம், பின்னர் இது போன்ற ஒன்றைப் பெறுவோம்:

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

அத்தகைய வினவலில் எங்காவது நீங்கள் எழுதினால் அல்லது பூஜ்யமாக இருந்தால் , இது அட்டவணைகளுக்கு இடையே இணைப்பதை ரத்து செய்யாது.

எனவே நடைமுறையில், நீங்கள் பல அட்டவணைகளின் புலங்களில் ஏதேனும் சிக்கலான வடிப்பானைச் செய்யும்போது, ​​Criteria API உங்களுக்கு உதவ முடியும். எனவே அது செல்கிறது.

மேலும் விவரங்களை அதிகாரப்பூர்வ ஆவணத்தில் காணலாம் .