Динамический поиск JPA
Всем доброго времени суток, хочу поделиться опытом поиска через JpaSpecificationExecutor. Авторы — Oliver Gierke и Christoph Strobl.
А так же много хорошего контента a.k.a Best Practices на нашем телеграм канале Java Best Practices присоединяйся и делись своим личном опытом мы рады каждому из Java community
JpaSpecificationExecutor является интерфейсом позволяющий выполнять Specification на основе API критериев JPA
И так допустим что нам надо вернуть массив данных по параметрам (page, perPage) и что бы была возможность динамической сортировки возвращаемого объекта
Для этого нам потребуется создать класс Criteria который будет содержать базовые параметры поиска.
Как видно из класса она имеет 4 поля которые можно указать в GET запросе ? page=1&perPage=10&sortBy=id&sortDirection=desc
Для дополнения класса полями можно создать собственный класс и наследоваться от GenericCriteria
Далее создадим абстрактный сервис в котором будет определен наш метод для поиска
Метод findAll принимает в качестве параметра Generic класс который наследуется от GenericCriteria и возвращает класс Page. Далее метод вызывает метод findAll итрейфейса JpaSpecificationExecutor и в лямбда выражении определяет интерфейс Specification с методом toPredicate который принимает три параметра: Root, CriteriaQuery и CriteriaBuilder
Далле вызывается метод processCriteriaSpecifications
Данный абстрактный класс по умолчанию работает без дополнительных predicate-ов только имея возможность для сортировки и пагинации
Для того что бы мы имели возможность динамического поиска, мы должны создать класс наследник от AbstractJpaService и переопределить метод processCriteriaSpecifications
Таким не хитрым образом мы использовали принципы solid и добились динамического поиска довольно просто и удобно.
Спасибо за внимание!
А так же много хорошего контента a.k.a Best Practices на нашем телеграм канале Java Best Practices присоединяйся и делись своим личном опытом мы рады каждому из Java community