Spring jpa запрос с возможностью просмотра страниц, сортировки и фильтрации и обратной проекции

Я использую Spring Data Rest с org.springframework.boot 1.5.2 с hibernate 5.2.9. То, что я пытаюсь достичь, - это способ использовать JPA для запросов с сортировкой, фильтрами, постраничным отображением, которые могут возвращать подмножество объекта или возвращать проекцию.

Ниже приведен код, который использует: (1) Спецификацию для фильтрации (2) Проекция и отрывки для применения проекции в коллекции (3) Контроллер, который пытается вернуть страницу, но он работает, только если тип возврата - Страница. где Student - это сущность, StudentLite - проекция

Вопрос в следующем: (1) Как создать фильтр запроса + сортировки +, который возвращает проекцию страницы (2) Можно ли применить выдержки только к этому запросу? (3) Любой способ использовать @JsonView в @RepositoryRestController для решения?

Студенческий репозиторий

@RepositoryRestResource(excerptProjection = StudentLite.class) 
public interface StudentRepository extends PagingAndSortingRepository<Student,Long>, 
JpaSpecificationExecutor<Student> {}

и StudentSpecification class

public class StudentSpecification {

    public static Specification<Student> filteredStudentList(StudentSearch c) {

        final StudentSearch criteria = c;

        return new Specification<Student>() {

            @Override
            public Predicate toPredicate(Root<Student> root, CriteriaQuery<?> query, CriteriaBuilder cb) {

                Join<Student, Contact> joinContact = root.join(Student_.contact);
                Path<Contact> contact = root.get(Student_.contact);

                Path<String> officialId     = root.get(Student_.officialId);
                Path<String> name           = root.get(Student_.name);
                Path<String> email          = contact.get(Contact_.email);
                Path<String> phoneMobile    = contact.get(Contact_.phoneMobile);

                final List<Predicate> predicates = new ArrayList<Predicate>();

                if(criteria.getOfficialId()!=null) {
                    predicates.add(cb.like(officialId, "%" + criteria.getOfficialId() + "%"));
                    System.out.println("==not null...criteria.getOfficialId()="+criteria.getOfficialId()+" :officialId="+officialId.toString());
                }
                if(criteria.getName()!=null) {
                    predicates.add(cb.like(name, "%"+criteria.getName()+"%"));
                }   
                if(criteria.getEmail()!=null) {
                    predicates.add(cb.like(email, "%"+criteria.getEmail()+"%"));
                }
                if(criteria.getPhoneMobile()!=null) {
                    predicates.add(cb.like(phoneMobile, "%"+criteria.getPhoneMobile()+"%"));
                }
                return cb.and(predicates.toArray(new Predicate[predicates.size()]));
            }
        };
    }
}

и контроллер, где класс аннотируется с помощью @ExposesResourceFor(Student.class) и @RepositoryRestController:

@RequestMapping(method=RequestMethod.GET)
    public @ResponseBody Page<StudentLite> getStudentList(Pageable pageable, @RequestParam Map<String,String> criteria) {

        StudentSearch ss = new StudentSearch(criteria);
        // Below statement fail, as findAll(...) is suppose to return Page<Student>
        Page<StudentLite> pagedStudentLite = studentRep.findAll( StudentSpecification.filteredStudentList(ss), pageable);

        return pagedStudentLite;
    }

0 ответов

Другие вопросы по тегам