hibernate - معين - معايير الاستعلام<>




كيفية استخدام معايير الاستعلامات في الربيع التمهيد البيانات جبا التطبيق (4)

لدي تطبيق يستخدم الربيع التمهيد البيانات جبا. حتى الآن أنا باستخدام مستودع مثل هذا

public interface StudentRepository extends CrudRepository<StudentEntity, Integer>{
          @Query(value = "SELECT s.studentname "
                    +"FROM StudentEntity s, CourseEntity c "
                    +"WHERE     s.courseid = c.courseid "
                    +"AND s.courseid IN (SELECT c.courseid "
                    +"FROM CourseEntity c "
                    +"WHERE c.coursename = ?1)")
      List<String> nameByCourse(String coursename);
}

كيف يمكنني الاستفادة من معايير الاستعلام الذي سبات يوفر لمثل هذه الحالات في تطبيق التمهيد الربيع


مع Spring-boot-jpa كنت قادرا على استخدام entityManager كل مكان تقريبا. الطريقة الأكثر كوموم هو خلق interface خاصة لطرق مخصصة.

public interface StudentCustomRepository {

    void anyCustomMethod();
    Student getStudentByName(String name);
}

ثم تنفيذ هذه الواجهة إلى فئة خدمة حيث كنت قادرا على أوتوير واستخدام entityManager :

@Service
public class StudentCustomRepositoryServiceImpl implements StudentCustomRepository {

     @PersistenceContext
     private EntityManager em;

     @Override
     public void anyCustomMethod(){
         //here use the entityManager
     }

     @Override
     StudentEntity getStudentByName(String name){
         Criteria crit = em.unwrap(Session.class).createCriteria(StudentEntity.class);
         crit.add(Restrictions.eq("name", name));
         List<StudentEntity> students = crit.list();
         return students.get(0);
     }
 }

يمكنك أيضا أن تقرر تنفيذ StudentCustomRepositoryServiceImpl الخاص بك إلى فئة StudentCustomRepositoryServiceImpl الجديدة.


من docs

لإثراء مستودع مع وظيفة مخصصة تقوم أولا بتعريف واجهة وتنفيذ وظيفة مخصصة. استخدم واجهة مستودع التخزين التي قدمتها لتوسيع الواجهة المخصصة.

تحديد واجهة مثل ذلك

public interface StudentRepositoryCustom {

    List<String> nameByCourse(String coursename);

}

ثم حدد تنفيذ مخصص لهذه الواجهة مثل ذلك

@Service
class StudentRepositoryImpl implements StudentRepositoryCustom {

    @PersistenceContext
    private EntityManager entityManager;

    public List<String> nameByCourse(String coursename) {            
        CriteriaBuilder cb = em.getCriteriaBuilder();
        //Using criteria builder you can build your criteria queries.
    }

}

الآن يمكنك توسيع هذا المخزن مخصص إمبليمنتيون في مستودع جبا الخاص بك مثل ذلك.

public interface StudentRepository extends CrudRepository<StudentEntity, Integer>, StudentRepositoryCustom {

}

تعرف على المزيد حول معايير الاستعلام ومعايير المعايير here


يمكنك الرجوع إلى إنشاء الاستعلام إلى بيانات جبا البيانات الربيع ونلقي نظرة على الجدول، جبا إعطاء إنشاء استعلام متعددة من أسماء الأسلوب حيث يمكنك تجنب استخدام استعلام سلسلة


يقدم جبا 2 معيار واجهة برمجة التطبيقات التي يمكن استخدامها لبناء الاستعلامات برمجيا.

يمكنك توسيع واجهة جديدة من JpaSpecificationExecutor

public interface CustomerRepository extends CrudRepository<Customer, Long>, JpaSpecificationExecutor {
    default List<Customer> findCustomers() {
    return findAll(CustomerSpecs.findCustomers());
}

ثم إنشاء مواصفات العملاء

public final class CustomerSpecs {

public static Specification<Customer> findCustomers() {
    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("birthday"), date);
  }
};
}

لمزيد من التفاصيل، يرجى الرجوع إلى مستند الربيع هذا هنا

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#specifications





spring-data-jpa