واجه كل من استخدم Spring Data موقفًا لديك فيه مستودع للعمل مع كيان وتريد كتابة طريقة بحث عامة للبحث بواسطة مجموعة من المعلمات التي يمكن للمستخدم تعيينها أو تخطيها في نموذج البحث. يعثر التطبيق الأساسي لطرق البحث في Spring Data على الكيانات مع مراعاة جميع المعلمات فقط ، ولا يسمح لك بالبحث عن طريق مجموعة محدودة. لقد وجدت طريقة لحل هذه المشكلة وأنشأت مكتبة مفتوحة المصدر للاستخدام السريع في مشاريع أخرى.
لفهم المشكلات ، دعنا نتخيل أننا نقوم بإنشاء تطبيق مفكرة بسيط ، نحدد فيه كيانًا - الشخص الذي يحمل معرف الحقول ، الاسم الأول ، اسم العائلة ، رقم الهاتف.
Person.java@Entity @Data @AllArgsConstructor @NoArgsConstructor @EqualsAndHashCode(of = "id") public class Person { @Id private Long id; private String firstName; private String lastName; private String phoneNumber; }
لنفترض أنه يجب علينا تقديم بحث بالاسم الأول والاسم الأخير وجزء من رقم الهاتف أو بأي مجموعة من هذه المعلمات ونريد ألا تأخذ طريقة البحث في الاعتبار المعلمات التي تكون قيمها فارغة. لحل هذه المشكلة ، يمكنك الذهاب بعدة طرق:
- العمل مباشرة مع قاعدة البيانات من خلال SQL ، إنشاء طريقة في الخدمة التي ستقوم بإنشاء استعلام SQL بشكل حيوي. شيء من هذا القبيل
استعلام ديناميكي Iterable<Person> find(String firstName, String lastName, String phoneNumber) { List<String> where = new ArrayList(); List params = new ArrayList(); if(firstName != null) { params.add(firstName); where.add("first_name = ?"); } if(lastName != null) { params.add(lastName); where.add("last_name = ?"); } if(phoneNumber != null) { params.add(phoneNumber); where.add("phone_number = ?"); } String sql = "SELECT * FROM person " + (where.isEmpty() ? "" : " WHERE " + String.join(" AND ", where));
- استخدم التعليق التوضيحي لطريقة البحث مع التحقق من المعلمة خالية.
query @Query("SELECT p FROM Person p " + "WHERE " + "(firstName = :firstName or :firstName is null) and " + "(lastName = :lastName or :lastName is null) and " + "(phoneNumber = :phoneNumber or :phoneNumber is null)" ) Iterable<Person> find( @Param("firstName") String firstName, @Param("lastName") String lastName, @Param("phoneNumber") String phoneNumber );
- يمكنك إنشاء طرق بحث لجميع مجموعات المعلمات الممكنة واستدعاء الطريقة المطلوبة بعد التحقق من المعلمات.
الكثير من طرق البحث @Repository public interface PersonRepo extends PagingAndSortingRepository<Person, Long> {
لن أحلل مزايا وعيوب كل طريقة ، فهي واضحة. لا أستطيع إلا أن أقول إنني اخترت الخيار الثالث بإضافة طرق البحث لكل متغير من تركيبة المعلمة وأنشأت مكتبة مفتوحة المصدر تستخدم آلية Annotation Processor وفي مرحلة التجميع تقوم بكل العمل نيابة عنك. لاستخدامها ، يجب عليك توصيل المكتبة (راجع أحدث إصدار على
https://github.com/ukman/kolobok أو
https://mvnrepository.com/artifact/com.github.ukman/kolobok ).
<dependency> <groupId>com.github.ukman</groupId> <artifactId>kolobok</artifactId> <version>0.1.2</version> <scope>compile</scope> </dependency>
فأنت بحاجة إلى وضع علامة على الطريقة التي يجب أن تعمل بطريقة جديدة مع التعليقات التوضيحيةFindWithOptionalParams.
@Repository public interface PersonRepo extends PagingAndSortingRepository<Person, Long> { @FindWithOptionalParams Iterable<Person> findByFirstNameAndLastNameAndPhoneNumberContains(String firstName, String lastName, String number); }
ستقوم المكتبة نفسها بإنشاء جميع أساليب البحث والتطبيق الافتراضي مع التحقق من المعلمات لإلغاء فارغة واستدعاء الطريقة المطلوبة.
ملحوظة: اكتب في التعليقات ما هي التعليقات التوضيحية الأخرى التي يمكن أن تبسط عملك مع Spring ، وربما سأضيفها أيضًا.