API Kriteria - Contoh Ungkapan IN

1. Gambaran keseluruhan

Kita sering menemui masalah di mana kita perlu membuat pertanyaan mengenai entiti berdasarkan sama ada atribut bernilai tunggal adalah anggota koleksi tertentu.

Dalam tutorial ini, kita akan belajar bagaimana menyelesaikan masalah ini dengan bantuan Criteria API.

2. Contoh Entiti

Sebelum kita mulakan, mari kita lihat entiti yang akan kita gunakan dalam penulisan kita.

Kami mempunyai kelas DeptEm Employee yang mempunyai hubungan banyak-dengan-satu dengan kelas Department :

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

Juga, entiti Jabatan yang memetakan ke beberapa DeptEm Employees :

@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 sekali, mari kita gunakan antara muka CriteriaBuilder . Kaedah in () menerima Ungkapan dan mengembalikan Predicate of the CriteriaBuilder.In jenis baru . Ia dapat digunakan untuk menguji apakah ekspresi yang diberikan terkandung 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. Ungkapan.In

Sebagai alternatif, kita dapat menggunakan sekumpulan kaedah () yang berlebihan dari antara muka Ekspresi :

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

Berbeza dengan CriteriaBuilder. di () , Expression.in () menerima kumpulan nilai. Seperti yang kita lihat, ini juga sedikit memudahkan kod kita.

5. Ekspresi DALAM Menggunakan Subkueri

Setakat ini, kami telah menggunakan koleksi dengan nilai yang telah ditentukan. Sekarang, mari kita lihat contoh apabila koleksi berasal dari output subkueri.

Sebagai contoh, kita dapat mengambil semua DeptEm Employee yang tergolong dalam Department, 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 subkueri yang kemudian diteruskan ke nilai () sebagai ungkapan untuk mencari entiti Jabatan .

6. Kesimpulannya

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

Akhirnya, pelaksanaan lengkap untuk tutorial ini boleh didapati di GitHub.