Menggabungkan JPA Dan / Atau Predikat Kriteria

1. Ikhtisar

API Kriteria JPA dapat digunakan untuk dengan mudah menambahkan beberapa kondisi DAN / ATAU saat membuat kueri catatan dalam database. Dalam tutorial ini, kita akan menjelajahi contoh cepat kueri kriteria JPA yang menggabungkan beberapa predikat DAN / ATAU.

Jika Anda tidak terbiasa dengan predikat, kami sarankan untuk membaca tentang kueri kriteria JPA dasar terlebih dahulu.

2. Contoh Aplikasi

Untuk contoh kami, kami akan mempertimbangkan inventaris entitas Item , masing-masing memiliki id, nama , warna , dan kelas :

@Entity public class Item { @Id private Long id; private String color; private String grade; private String name; // standard getters and setters }

3. Menggabungkan Dua ATAU Predikat Menggunakan Predikat AND

Mari pertimbangkan kasus penggunaan di mana kita perlu menemukan item yang memiliki keduanya:

  1. warna merah atau biru

    DAN

  2. Kelas A atau B.

Kita dapat dengan mudah melakukan ini menggunakan predikat gabungan JPA Criteria API dan () dan atau () .

Untuk memulai, mari kita siapkan kueri kita:

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Item.class); Root itemRoot = criteriaQuery.from(Item.class);

Sekarang, kita perlu membuat Predikat untuk menemukan item yang memiliki warna biru atau merah:

Predicate predicateForBlueColor = criteriaBuilder.equal(itemRoot.get("color"), "blue"); Predicate predicateForRedColor = criteriaBuilder.equal(itemRoot.get("color"), "red"); Predicate predicateForColor = criteriaBuilder.or(predicateForBlueColor, predicateForRedColor);

Selanjutnya, mari buat Predikat untuk menemukan item dengan kelas A atau B:

Predicate predicateForGradeA = criteriaBuilder.equal(itemRoot.get("grade"), "A"); Predicate predicateForGradeB = criteriaBuilder.equal(itemRoot.get("grade"), "B"); Predicate predicateForGrade = criteriaBuilder.or(predicateForGradeA, predicateForGradeB);

Terakhir, kami mendefinisikan Predikat AND dari keduanya, menerapkan metode where () , dan menjalankan kueri kami:

Predicate finalPredicate = criteriaBuilder.and(predicateForColor, predicateForGrade); criteriaQuery.where(finalPredicate); List items = entityManager.createQuery(criteriaQuery).getResultList();

4. Menggabungkan Dua Predikat DAN Menggunakan Predikat ATAU

Di sisi lain, mari pertimbangkan kasus di mana kita perlu menemukan item yang memiliki:

  1. warna merah dan grade D.

    ATAU

  2. warna biru dan kelas B.

Logikanya sangat mirip, tetapi di sini kita membuat dua Predikat AND terlebih dahulu dan kemudian menggabungkannya menggunakan Predikat ATAU :

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Item.class); Root itemRoot = criteriaQuery.from(Item.class); Predicate predicateForBlueColor = criteriaBuilder.equal(itemRoot.get("color"), "red"); Predicate predicateForGradeA = criteriaBuilder.equal(itemRoot.get("grade"), "D"); Predicate predicateForBlueColorAndGradeA = criteriaBuilder.and(predicateForBlueColor, predicateForGradeA); Predicate predicateForRedColor = criteriaBuilder.equal(itemRoot.get("color"), "blue"); Predicate predicateForGradeB = criteriaBuilder.equal(itemRoot.get("grade"), "B"); Predicate predicateForRedColorAndGradeB = criteriaBuilder.and(predicateForRedColor, predicateForGradeB); Predicate finalPredicate = criteriaBuilder .or(predicateForBlueColorAndGradeA, predicateForRedColorAndGradeB); criteriaQuery.where(finalPredicate); List items = entityManager.createQuery(criteriaQuery).getResultList();

5. Kesimpulan

Dalam tutorial ini, kami menggunakan API Kriteria JPA untuk mengimplementasikan kasus penggunaan di mana kami perlu menggabungkan predikat AND / OR.

Seperti biasa, kode sumber lengkap yang digunakan untuk tutorial ini berakhir di GitHub.