Pambuka kanggo API Kriteria

Ana rong cara kanggo nulis pitakon database ing Hibernate:

  • Basa Pitakonan Hibernate
  • Kriteria API

Sampeyan wis suwe ketemu sing pertama, wektune kanggo kenal karo API Kriteria. Iki minangka alat sing kuat banget, ing sawetara wektu malah luwih populer tinimbang HQL. Saiki ora populer maneh, nanging kanggo sawetara tugas mesthi bakal dadi solusi sing luwih apik tinimbang HQL.

Ing kasus apa wae, sampeyan ora bisa sinau Hibernate tanpa kenal karo API Kriteria. Ayo nulis conto cilik, banjur kita bakal nganalisis. Contone, kita bakal njaluk kabeh karyawan (Karyawan) saka database. Mangkene apa sing bakal kita entuk:

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

Katon rumit. Ayo nulis pitakon HQL sing padha kanggo mbandhingake:

String hqlQuery = "from Employee";

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

Elinga yen rong baris pungkasan saka loro conto meh padha: kita nggawe obyek Query lan nggunakake kanggo njaluk Dhaptar. Iki menehi tandha manawa garis liyane nindakake perkara sing padha.

Deleng baris 3 lan 4 saka conto pisanan:

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

Ayo ditulis ing siji baris:

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

Apa ora ngelingake sampeyan apa-apa? Lan yen sampeyan wernane rada beda:

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

Ya, iki minangka konstruksi rumit saka pitakon SELECT FROM.

Conto nggarap API Kriteria

Kanggo pangerten sing luwih apik, aku mung bakal menehi sawetara conto.

Panjaluk 1 . Njaluk kabeh karyawan kanthi gaji luwih saka 10 ewu:

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

Panjaluk 2 . Njaluk kabeh karyawan sing gajine kurang saka 50 ewu:

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

Panjaluk 3 . Entuk kabeh karyawan sing jabatane ngemot tembung "tes":

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

Panjaluk 4 . Njaluk kabeh karyawan kanthi gaji 10 nganti 50 ewu:

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

Panjaluk 5 . Entuk kabeh karyawan sing jenenge null:

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

Panjaluk 6 . Entuk kabeh karyawan sing jenenge ora null:

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

Iku mung cara sing angel kanggo mbangun pitakon:

  • Pisanan sampeyan entuk obyek kasebutCriteriaBuilder.
  • Banjur gunakake kanggo nggawe obyekKriteriaQuery.
  • Banjur sampeyan miwiti nambah bagean karoKriteriaQuerylanCriteriaBuilder.

Iki carane sampeyan bisa nyetel paramèter kanggo:

  • PILIH
  • Saka
  • NENGEndi

Uga nggunakakeCriteriaBuildersampeyan bisa mbangun kahanan sing beda kanggo WHERE.

Karya majeng karo API Kriteria

Nggunakake API Kriteria, sampeyan bisa nggawe pitakon babagan kerumitan apa wae. Lan iki warta apik. Contone, sampeyan pengin klausa WHERE kompleks. Mangkene carane nindakake:

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

Yen sampeyan pengin nulis AND tinimbang OR, sampeyan mung kudu ngganti baris pungkasan:

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

Kabeh iku bener banget prasaja. Ayo kula menehi sampeyan tabel kanthi sawetara perbandingan:

SQL Metode Rekaman lengkap
a<b lt (a, b) tukang bangunan.lt(a,b)
a > b gt (a, b) builder.gt(a, b)
a UTAWA b utawa (a, b) tukang bangunan.or(a,b)
a lan b lan (a,b) tukang bangunan.lan(a,b)
a LIKE b kaya (a, b) builder.like(a,b)
a ANTARA (c, d) antarane (a, c, d) pembangun.antarane(a,c,d)
a IS NULL isNull(a) builder.isNull(a)
a IS NOT NULL isNotNull(a) builder.isNotNull(a)

Kabeh iku prasaja, ta?

Lan kepiye carane nambah ngurutake pitakon? Prasaja banget:

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

Sampeyan mung nelpon ing obyekKriteriaQueryorderBy () lan pass paramèter sing dibutuhake.

Mangkene carane pitakon sing padha bakal katon ing HQL. mbandhingake:

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

Sampeyan mung kudu ngelingi 3 perkara:

  • Operator tombol kaya SELECT, FROM, WHERE diarani obyekKriteriaQuery.
  • Operator tambahan kaya AND, OR, DESC diarani obyek kasebutCriteriaBuilder.
  • Jeneng lapangan dijupuk saka obyek liwat get()oyod.