Menggabungkan JPA Dan / Atau Predikat Kriteria

1. Gambaran keseluruhan

API Kriteria JPA dapat digunakan untuk menambahkan beberapa syarat AND / OR dengan mudah ketika membuat pertanyaan dalam pangkalan data. Dalam tutorial ini, kita akan meneroka contoh ringkas pertanyaan kriteria JPA yang menggabungkan banyak predikat AND / ATAU.

Sekiranya anda tidak biasa dengan predikat, kami sarankan membaca terlebih dahulu mengenai pertanyaan kriteria asas JPA.

2. Contoh Permohonan

Sebagai contoh, kami akan mempertimbangkan inventori entiti Item , masing-masing mempunyai id, nama , warna , dan gred :

@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 DAN

Mari pertimbangkan kes penggunaan di mana kita perlu mencari item yang mempunyai kedua-duanya:

  1. warna merah atau biru

    DAN

  2. Gred A atau B

Kita boleh melakukannya dengan mudah menggunakan predikat predikat JPA Criteria API dan () dan atau () .

Untuk memulakan, mari sediakan pertanyaan kami:

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

Sekarang, kita perlu membina Predicate untuk mencari item yang mempunyai 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);

Seterusnya, mari buat Predicate untuk mencari item gred 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);

Akhirnya, kami mendefinisikan DAN Predikat kedua, menerapkan kaedah di mana () , dan melaksanakan pertanyaan kami:

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

4. Menggabungkan Dua DAN Predikat Menggunakan Predikat ATAU

Sebaliknya, mari kita pertimbangkan kes di mana kita perlu mencari item yang mempunyai:

  1. warna merah dan gred D

    ATAU

  2. warna biru dan gred B

Logiknya agak serupa, tetapi di sini kita membuat dua DAN Predikat pertama 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 JPA Criteria API untuk melaksanakan kes penggunaan di mana kami perlu menggabungkan predikat DAN / ATAU.

Seperti biasa, kod sumber lengkap yang digunakan untuk tutorial ini sudah habis di GitHub.