2013-09-09 1 views
2

Привет Я пишу метод Specification.toPredicate() для поиска объектов на основе критериев поиска, введенных в стандартную форму. У меня он работает для поиска на родительском объекте, но вам нужно искать атрибут дочерних элементов (которые отображаются и удерживаются в наборе). Отображение много для многих.Spring Data Predicate - Атрибут поиска в дочерней коллекции

Поиск по атрибуту child будет возвращать все родительские элементы, в которых поиск совпадает с введенным дочерним атрибутом.

Например, используя простую связь между Учителем [Родитель] и [Ученика ребенка]

 @Entity 
     class Teacher { 
      @Id 
      @Column(name = "ID") 
      private Long id; 

      @Column(name = "NAME") 
      private String name; 

      @ManyToMany(fetch = FetchType.EAGER) 
      @JoinTable(name = "TEACHER_PUPIL", 
           joinColumns = 
      @JoinColumn(name = "TEACHER_ID", referencedColumnName = "ID"), 
           inverseJoinColumns = 
      @JoinColumn(name = "PUPIL_ID", referencedColumnName = "ID")) 
      Set<Pupil> pupils; 

        // etc. 

    } 

     @Entity 
     class Pupil { 
      @Id 
      @Column(name = "ID") 
      private Long id; 

      @Column(name = "NAME") 
      private String name; 
      // etc. 

    } 

      public class ClassSpecifications { 


       public static Specification<Teacher> filterCriteria(final MyCustomForm myForm) { 

           return new Specification<Teacher>() { 

           @Override 
           public Predicate toPredicate(Root<Teacher> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) { 

            List<Predicate> predicates = new ArrayList<Predicate>(); 
               // *** this works fine. 
           if (myForm.getSearchName() != null) {     
                  Expression<String> expression = root.get("name"); 
             predicates.add(criteriaBuilder.like(criteriaBuilder.upper(expression), "%" + myForm.getSearchName().toUpperCase() + "%")); 
           } 


               if (myForm.getPupilNameSearch() ! = null) { 
               // HERE SEARCH List for the pupil's name like. 
               } 

           criteriaQuery.where(predicates.toArray(new Predicate[predicates.size()])); 
           return null; 

          } 


        } 





    @Repository 
    public interface TeacherDAO extends JpaRepository<Teacher, Long> , JpaSpecificationExecutor<Teacher>{ 

    } 

// вызов будет:

teacherDAO.findAll(ClassSpecifications.filterCriteria(searchForm)); 

Спасибо.

ответ

0

SetJoin transaction = root.joinSet ("зрачки");

   Expression<String> expression = transactions.get("name"); 
       predicates.add(criteriaBuilder.like(criteriaBuilder.upper(expression), "%" + myForm.getPupilNameSearch().toUpperCase()+ "%"));