Masalah:
Repositori JPA Data Spring menyokong penciptaan pertanyaan dengan tetap, dipratentukan parameter. Walau bagaimanapun, terdapat keperluan untuk menjana pertanyaan secara dinamik dengan klausa AND sewenang-wenangnya berdasarkan medan yang disediakan pengguna. Pendekatan ini berskala buruk dan memerlukan definisi pertanyaan yang jelas untuk setiap kombinasi yang mungkin.
Pendekatan Terbaik: Spesifikasi dengan API Kriteria
Data Spring menyediakan Spesifikasi yang memanfaatkan API Kriteria untuk membina fleksibel dan dinamik pertanyaan. Dengan memanjangkan antara muka repositori dengan JpaSpecificationExecutor, adalah mungkin untuk melaksanakan Spesifikasi menggunakan pelbagai kaedah, termasuk findAll.
Antara Muka Spesifikasi:
public interface Specification<T> { Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder builder); }
Contoh Pelaksanaan:
public static Specification<Customer> isLongTermCustomer() { return new Specification<Customer>() { public Predicate toPredicate(Root<Customer> root, CriteriaQuery<?> query, CriteriaBuilder builder) { LocalDate date = new LocalDate().minusYears(2); return builder.lessThan(root.get('dateField'), date); } }; } public static Specification<Customer> hasSalesOfMoreThan(MontaryAmount value) { return new Specification<Customer>() { public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder builder) { // build query here } }; }
Contoh Penggunaan:
List customers = customerRepository.findAll(isLongTermCustomer()); MonetaryAmount amount = new MonetaryAmount(200.0, Currencies.DOLLAR); List<Customer> customers = customerRepository.findAll( where(isLongTermCustomer()).or(hasSalesOfMoreThan(amount)));
Spesifikasi Kompleks:
Untuk spesifikasi yang kompleks , anda boleh menentukan kaedah tersuai dalam spesifikasi anda kelas:
public static Specification<WorkInProgress> findByCriteria(final SearchCriteria searchCriteria) { return new Specification<WorkInProgress>() { public Predicate toPredicate(Root<WorkInProgress> root, CriteriaQuery<?> query, CriteriaBuilder cb) { List<Predicate> predicates = new ArrayList<Predicate>(); // Add predicates based on search criteria return cb.and(predicates.toArray(new Predicate[] {})); } }; }
Kesimpulan:
Spesifikasi membenarkan penjanaan pertanyaan dinamik tanpa memerlukan definisi pertanyaan yang jelas. Pendekatan ini boleh skala dan boleh diperluaskan, memudahkan penciptaan pertanyaan yang fleksibel dan boleh disesuaikan. Rujuk dokumentasi JPA Repositories untuk maklumat lanjut.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencipta Pertanyaan JPA Data Spring Dinamik dengan Arbitrari DAN Klausa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!