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:
- warna merah atau biru
DAN
- 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:
- warna merah dan grade D.
ATAU
- 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.