Вы можете использовать Specifications
в Spring Data
.
Просто сделайте ваш PeopleService
интерфейс (если это ваш интерфейс хранилища данных Spring) расширяющим JpaSpecificationExecutor< People >
и создайте класс наподобие PeopleSpecification
, который реализует Specification< People >
следующим образом:
public class PeopleSpecification implements Specification<People> {
private String firstName;
//getters and setters
public Predicate toPredicate(Root<People> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
if (firstName != null)
return cb.equal(root.get("firstName"), firstName);
return cb.and();
}
}
Затем измените метод контроллера, чтобы получить экземпляр PeopleSpecification
в качестве параметра:
public Page<People> list(@ModelAttribute PeopleSpecification specification, Pagable pageable)
И, наконец, используйте новый унаследованный метод от JpaSpecificationExecutor
в вашем PeopleService
в вашем контроллере:
Page<People> findAll(Specification<People> specification, Pageable pageable);
Понятно, что вы можете изменить реализацию класса PeopleSpefication
, чтобы иметь столько атрибутов, сколько хотите, и изменить логику метода toPredicate
, чтобы он возвращал правильный объект Predicate.