Pengantar API Kriteria

Ada dua cara untuk menulis kueri database di Hibernate:

  • Bahasa Kueri Hibernasi
  • Kriteria API

Anda sudah lama bertemu dengan yang pertama, sekarang saatnya berkenalan dengan Criteria API. Ini adalah alat yang sangat ampuh, di beberapa titik bahkan lebih populer daripada HQL. Sekarang tidak begitu populer lagi, tetapi untuk beberapa tugas pasti akan menjadi solusi yang lebih baik daripada HQL.

Bagaimanapun, Anda tidak dapat mempelajari Hibernate tanpa mengenal Criteria API. Mari kita tulis contoh kecil, lalu kita akan menganalisisnya. Misalnya, kami akan meminta semua karyawan (Employee) dari database. Inilah yang akan kita dapatkan:

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

Terlihat rumit. Mari tulis kueri HQL yang sama untuk perbandingan:

String hqlQuery = "from Employee";

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

Perhatikan bahwa dua baris terakhir dari kedua contoh hampir identik: kami membuat objek Kueri dan menggunakannya untuk mendapatkan Daftar. Ini mengisyaratkan bahwa baris lainnya melakukan sesuatu yang identik.

Lihatlah baris 3 dan 4 dari contoh pertama:

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

Mari kita tulis dalam satu baris:

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

Apakah itu tidak mengingatkan Anda pada sesuatu? Dan jika Anda mewarnainya sedikit berbeda:

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

Ya, ini adalah konstruksi kueri SELECT FROM yang rumit.

Contoh bekerja dengan Criteria API

Untuk pemahaman yang lebih baik, saya hanya akan memberikan beberapa contoh.

Permintaan 1 . Dapatkan semua karyawan dengan gaji di atas 10 ribu:

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

Permintaan 2 . Dapatkan semua karyawan dengan gaji kurang dari 50 ribu:

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

Permintaan 3 . Dapatkan semua karyawan yang jabatannya mengandung kata "tes":

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

Permintaan 4 . Dapatkan semua karyawan dengan gaji 10 hingga 50 ribu:

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

Permintaan 5 . Dapatkan semua karyawan yang namanya null:

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

Permintaan 6 . Dapatkan semua karyawan yang namanya bukan nol:

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

Ini hanya cara yang rumit untuk membuat kueri:

  • Pertama Anda mendapatkan objeknyaPembuat Kriteria.
  • Kemudian gunakan untuk membuat objekKriteriaPermintaan.
  • Kemudian Anda mulai menambahkan bagian ke dalamnyaKriteriaPermintaanDanPembuat Kriteria.

Ini adalah bagaimana Anda dapat mengatur parameter untuk:

  • PILIH
  • DARI
  • DI MANA

Juga menggunakanPembuat KriteriaAnda dapat membuat kondisi yang berbeda untuk WHERE.

Pekerjaan tingkat lanjut dengan Criteria API

Dengan menggunakan Criteria API, Anda dapat membuat kueri dengan kerumitan apa pun. Dan ini adalah berita bagus. Misalnya, Anda menginginkan klausa WHERE yang kompleks. Inilah cara melakukannya:

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

Jika Anda ingin menulis DAN alih-alih ATAU, maka Anda hanya perlu mengubah baris terakhir:

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

Semuanya sebenarnya sangat sederhana. Izinkan saya memberi Anda tabel dengan beberapa perbandingan:

SQL metode Rekor penuh
a<b itu(a, b) pembangun.lt(a, b)
a > b gt(a, b) pembangun.gt(a, b)
a ATAU b atau (a,b) pembangun.or(a, b)
a DAN b dan (a,b) pembangun.dan(a,b)
SEPERTI b seperti (a,b) pembangun.seperti(a, b)
a ANTARA (c, d) antara (a, c, d) pembangun.antara(a, c, d)
a IS NULL isNull(a) pembangun.isNull(a)
a BUKAN NULL isNotNull(a) pembangun.isNotNull(a)

Semuanya sederhana, bukan?

Dan bagaimana kita menambahkan penyortiran ke kueri? Sangat sederhana:

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

Anda hanya memanggil objekKriteriaPermintaanorderBy() metode dan berikan parameter yang diperlukan untuk itu.

Begini tampilan kueri yang sama di HQL. Membandingkan:

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

Anda hanya perlu mengingat 3 hal:

  • Operator kunci seperti SELECT, FROM, WHERE dipanggil pada objekKriteriaPermintaan.
  • Operator bantu seperti AND, OR, DESC dipanggil pada objekPembuat Kriteria.
  • Nama bidang diambil dari objek melalui get()akar.