Panimula sa Criteria API

Mayroong dalawang paraan upang magsulat ng mga query sa database sa Hibernate:

  • Hibernate Query Language
  • Criteria API

Matagal mo nang nakilala ang una, oras na para maging pamilyar sa Criteria API. Ito ay isang napakalakas na tool, sa ilang mga punto ay mas sikat pa ito kaysa sa HQL. Ngayon ay hindi na ito sikat, ngunit para sa ilang mga gawain ay tiyak na magiging mas mahusay na solusyon ito kaysa sa HQL.

Sa anumang kaso, hindi mo matutunan ang Hibernate nang hindi pamilyar sa Criteria API. Sumulat tayo ng isang maliit na halimbawa, at pagkatapos ay susuriin natin ito. Halimbawa, hihilingin namin ang lahat ng empleyado (Empleyado) mula sa database. Narito ang makukuha natin:

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

Mukhang kumplikado. Isulat natin ang parehong query sa HQL para sa paghahambing:

String hqlQuery = "from Employee";

Query<Employee> query = session.createQuery(hqlQuery);
List<Employee> results = query.getResultList();

Tandaan na ang huling dalawang linya ng parehong mga halimbawa ay halos magkapareho: gumagawa kami ng Query object at ginagamit ito upang makakuha ng Listahan. Ito ay nagpapahiwatig na ang natitirang mga linya ay gumagawa ng isang bagay na magkapareho.

Tingnan ang mga linya 3 at 4 ng unang halimbawa:

Root<Employee> root = critQuery.from(Employee.class);
critQuery.select(root);

Isulat natin sila sa isang linya:

critQuery.select(critQuery.from(Employee.class));

Hindi ba ito nagpapaalala sa iyo ng kahit ano? At kung kulayan mo ito nang medyo naiiba:

critQuery.select(critQuery.from(Employee.class));

Oo, ito ay isang nakakalito na pagbuo ng SELECT FROM query.

Mga halimbawa ng pagtatrabaho sa Criteria API

Para sa isang mas mahusay na pag-unawa, magbibigay lamang ako ng ilang mga halimbawa.

Kahilingan 1 . Kunin ang lahat ng empleyado na may suweldo na higit sa 10 libo:

critQuery.select(critQuery.from(Employee.class)).where(builder.gt(root.get("salary"), 10000));

Kahilingan 2 . Kunin ang lahat ng empleyado na may suweldo na mas mababa sa 50 libo:

critQuery.select(critQuery.from(Employee.class)).where(builder.lt(root.get("salary"), 50000));

Kahilingan 3 . Kunin ang lahat ng empleyado na ang titulo ng trabaho ay naglalaman ng salitang "pagsusulit":

critQuery.select(critQuery.from(Employee.class)).where(builder.like(root.get("occupation"), "%test%"));

Kahilingan 4 . Kunin ang lahat ng empleyado na may suweldong 10 hanggang 50 libo:

critQuery.select(critQuery.from(Employee.class)).where(builder.between(root.get("salary"), 10000, 50000));

Kahilingan 5 . Kunin ang lahat ng empleyado na ang pangalan ay null:

critQuery.select(critQuery.from(Employee.class)).where(builder.isNull(root.get("name")));

Kahilingan 6 . Kunin ang lahat ng empleyado na ang pangalan ay hindi null:

critQuery.select(critQuery.from(Employee.class)).where(builder.isNotNull(root.get("name")));

Ito ay isang nakakalito na paraan upang makabuo ng isang query:

  • Una mong makuha ang bagayTagabuo ng Pamantayan.
  • Pagkatapos ay gamitin ito upang lumikha ng isang bagayCriteriaQuery.
  • Pagkatapos ay magsisimula kang magdagdag ng mga bahagi ditoCriteriaQueryAtTagabuo ng Pamantayan.

Ito ay kung paano ka makakapagtakda ng mga parameter para sa:

  • PUMILI
  • MULA SA
  • SAAN

Gumagamit dinTagabuo ng Pamantayanmaaari kang bumuo ng iba't ibang mga kondisyon para sa WHERE.

Advanced na trabaho sa Criteria API

Gamit ang Criteria API, maaari kang bumuo ng isang query ng anumang kumplikado. At ito ay magandang balita. Halimbawa, gusto mo ng kumplikadong sugnay na WHERE. Narito kung paano ito gawin:

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

Kung gusto mong magsulat ng AT sa halip na OR, kailangan mo lang baguhin ang huling linya:

critQuery.select(critQuery.from(Employee.class)).where(builder.and(greaterThan, testers));

Ang lahat ay talagang napaka-simple. Hayaan akong bigyan ka ng isang talahanayan na may ilang mga paghahambing:

SQL Pamamaraan Buong record
a<b lt(a, b) builder.lt(a, b)
a > b gt(a, b) builder.gt(a, b)
a O b o(a,b) builder.or(a, b)
a AT b at(a,b) builder.and(a,b)
isang LIKE b tulad ng (a, b) builder.like(a, b)
a PAGITAN (c, d) sa pagitan ng(a, c, d) builder.between(a, c, d)
a IS NULL isNull(a) builder.isNull(a)
a AY HINDI NULL isNotNull(a) builder.isNotNull(a)

Ang lahat ay simple, hindi ba?

At paano namin idaragdag ang pag-uuri sa query? Napakasimple:

critQuery.select( critQuery.from(Employee.class) );
critQuery.where( builder.and(greaterThan, testers) );
critQuery.orderBy( builder.asc(root.get("salary"), builder.desc(root.get("joinDate") )

Tumawag ka lang sa bagayCriteriaQueryorderBy() na paraan at ipasa ang mga kinakailangang parameter dito.

Narito ang magiging hitsura ng parehong query sa HQL. Ihambing:

select * from Employee
where (…) and (…)
order by 'salary' asc, 'joinDate' desc

Kailangan mo lang tandaan ang 3 bagay:

  • Ang mga pangunahing operator tulad ng SELECT, FROM, WHERE ay tinatawag sa isang objectCriteriaQuery.
  • Ang mga auxiliary operator tulad ng AND, OR, DESC ay tinatawag sa objectTagabuo ng Pamantayan.
  • Ang mga pangalan ng field ay kinuha mula sa object sa pamamagitan ng get()ugat.