API Kriteria - Contoh Ekspresi IN

1. Ikhtisar

Kami sering menjumpai masalah di mana kami perlu menanyakan entitas berdasarkan apakah atribut bernilai tunggal adalah anggota dari koleksi tertentu.

Dalam tutorial ini, kita akan belajar bagaimana mengatasi masalah ini dengan bantuan API Kriteria .

2. Entitas Sampel

Sebelum kita mulai, mari kita lihat entitas yang akan kita gunakan dalam artikel kita.

Kami memiliki kelas DeptEmployee yang memiliki hubungan banyak-ke-satu dengan kelas Departemen :

@Entity public class DeptEmployee { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private long id; private String title; @ManyToOne private Department department; }

Juga, entitas Departemen yang memetakan ke beberapa DeptEmployee :

@Entity public class Department { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private long id; private String name; @OneToMany(mappedBy="department") private List employees; }

3. The CriteriaBuilder.In

Pertama-tama, mari gunakan antarmuka CriteriaBuilder . The dalam () metode menerima sebuah Ekspresi dan mengembalikan baru Predikat dari CriteriaBuilder.In jenis . Ini dapat digunakan untuk menguji apakah ekspresi yang diberikan terdapat dalam daftar nilai:

CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(DeptEmployee.class); Root root = criteriaQuery.from(DeptEmployee.class); In inClause = criteriaBuilder.in(root.get("title")); for (String title : titles) { inClause.value(title); } criteriaQuery.select(root).where(inClause);

4. Ekspresi.In

Alternatifnya, kita bisa menggunakan sekumpulan metode overloaded in () dari antarmuka Expression :

criteriaQuery.select(root) .where(root.get("title") .in(titles));

Berbeda dengan CriteriaBuilder. in () , Expression.in () menerima kumpulan nilai. Seperti yang bisa kita lihat, ini juga menyederhanakan kode kita sedikit.

5. DI Ekspresi Menggunakan Subqueries

Sejauh ini, kami telah menggunakan koleksi dengan nilai yang telah ditentukan sebelumnya. Sekarang, mari kita lihat contoh saat koleksi diturunkan dari keluaran subkueri.

Misalnya, kita dapat mengambil semua DeptEmployee yang termasuk dalam suatu Departemen, dengan kata kunci yang ditentukan dalam namanya:

Subquery subquery = criteriaQuery.subquery(Department.class); Root dept = subquery.from(Department.class); subquery.select(dept) .distinct(true) .where(criteriaBuilder.like(dept.get("name"), "%" + searchKey + "%")); criteriaQuery.select(emp) .where(criteriaBuilder.in(emp.get("department")).value(subquery));

Di sini, kami membuat subquery yang kemudian diteruskan ke value () sebagai ekspresi untuk mencari entitas Departemen .

6. Kesimpulan

Dalam artikel singkat ini, kami telah mempelajari berbagai cara untuk mencapai operasi IN menggunakan API Kriteria. Kami juga telah mempelajari cara menggunakan API Kriteria dengan subkueri.

Terakhir, implementasi lengkap untuk tutorial ini tersedia di GitHub.