Mga function ng pagpapangkat at pagsasama-sama
Naisip mo na kung paano gumawa ng mga simpleng kahilingan sa Criteria API. Tingnan natin kung paano gumawa ng mas kumplikadong mga query.
Halimbawa, gusto naming magsulat ng query para matukoy ang bilang ng mga empleyado sa isang kumpanya. Narito ang magiging hitsura nito sa HQL:
select count(*) from Employee
At tulad nito sa Criteria API:
CriteriaQuery<Long> critQuery = builder.createQuery(Long.class);
critQuery.select(builder.count(critQuery.from(Employee.class)));
Ang kumpletong Java code ay magiging ganito:
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();
At pareho ito gamit ang HQL:
String hqlQuery = "select count(*) from Employee";
Query<Long> query = session.createQuery(hqlQuery);
Long count = query.getSingleResult();
Ngayon subukan nating kalkulahin ang average na suweldo sa kumpanya. Ang query ng HQL ay magiging ganito:
select avg(salary) from Employee
At tulad nito sa Criteria API:
CriteriaQuery<Double> critQuery = builder.createQuery(Double.class);
critQuery.select(builder.avg( critQuery.from(Employee.class).get("salary")));
Ang kumpletong Java code ay magiging ganito:
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();
CriteriaUpdate
Ang pagbabago ng isang talahanayan ay kasingdali ng pagkuha ng data mula dito. Upang gawin ito, may espesyal na pamamaraan ang CriteriaBuilder - createCriteriaUpdate() , na lumilikha ng isang bagayCriteriaUpdate<T>Ang nag-a-update ng mga entity sa database.
Itaas natin ang sahod ng mga empleyadong tumatanggap ng wala pang 10 thousand. Narito ang magiging hitsura ng query ng HQL na ito:
update Employee set salary = salary+20000 where salary<=10000
At ganito ang magiging hitsura nito sa Criteria 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();
Pamantayan Tanggalin
At ang pagtanggal ng mga tala ay mas madali kaysa sa pagbabago ng mga ito. Upang gawin ito, mayroong isang espesyal na paraan createCriteriaDelete() , na lumilikha ng isang bagayPamantayan Tanggalin<T>.
Putulin natin ang lahat ng empleyadong walang halaga: wala pang 10 libo ang kanilang suweldo. Narito ang magiging hitsura ng query ng HQL na ito:
delete from Employee where salary<=10000
At ganito ang magiging hitsura nito sa Criteria 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();
Mga Benepisyo ng Criteria API
Kaya ano ang pakinabang ng Criteria API? Ang mga tanong ay masalimuot, tiyak na magiging mas compact ang HQL.
Una, ang mga query sa HQL ay hindi masyadong maikli kung kailangan mong ipasa ang mga parameter sa kanila. Ihambing:
Isinasaalang-alang namin ang bilang ng mga empleyado na may suweldo na mas mababa sa 10 libo |
---|
HQL |
|
Criteria API |
|
Pangalawa, napakadalas na mayroong isang sitwasyon kung kailan ang isang query ay kailangang dynamic na binuo. Halimbawa, mayroon kang isang web page na nag-filter ng mga empleyado, apartment, at anumang bagay. At kung ang ilang parameter ay hindi mahalaga sa gumagamit, kung gayon hindi niya ito ipinapahiwatig. Alinsunod dito, ang null ay ipinasa sa server sa halip.
Narito ang iyong gawain: pumili ng mga empleyado na may partikular na propesyon (trabaho), suweldo (suweldo) at taon ng pagtatrabaho (TAON (join_date)). Ngunit kung ang anumang halaga ng parameter ay null, pagkatapos ay huwag gamitin ito sa filter.
Pagkatapos ang query ng HQL ay magiging ganito:
from Employee
where (occupation = :ocp)
and (salary = :sal)
and ( YEAR(join_date) = :jny)
Ngunit hindi ito gagana nang tama, dahil gusto namin na kung ang parameter na "jny" ay null, ang kahilingan ay magiging ganito:
from Employee
where (occupation = :ocp)
and (salary = :sal)
Maaari naming subukang isulat muli ang kahilingan sa pagsuri sa parameter para sa null, pagkatapos ay makakakuha kami ng isang bagay na tulad nito:
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)
Tingnan kung paano nagiging mas kumplikado ang katotohanan? Madalas ganito ang realidad :)
Ngunit ang filter ay maaaring maging mas kumplikado. Paano ang tungkol sa paghahanap para sa mga user na may mga gawain na may salitang "bumili" sa kanila? O mga user na may mga overdue na gawain?
from Employee
where (occupation = :ocp)
and (salary = :sal)
and (YEAR(join_date) = :jny)
and (tasks.name like '%buy%')
and (tasks.deadline < curdate())
Kung sumulat ka o null sa isang lugar sa naturang query , hindi nito kakanselahin ang pagsali sa pagitan ng mga talahanayan.
Kaya sa pagsasagawa, kapag gumawa ka ng anumang kumplikadong filter sa mga patlang ng ilang mga talahanayan, matutulungan ka lang ng Criteria API. Kaya ito napupunta.
Higit pang mga detalye ay matatagpuan sa opisyal na dokumentasyon .