@NyxDeveloper

Как можно избежать написания большого количества функций репозитория?

Пишу бэкенд веб приложения, в котором присутствуют формы фильтров данных. Есть какие-нибудь способы не писать эти бесконечные вариации findAllByFirstAndSecondAndThirdAndSome?
Пытался сделать свое решение, но тщетно, другого готового еще не встречал. Искал документацию по фильтрам, но фильтры в спринговом понимании, как оказалось, это middleware.
Поделитесь советом или дайте доку, пожалуйста.
  • Вопрос задан
  • 2896 просмотров
Решения вопроса 2
sergey-gornostaev
@sergey-gornostaev Куратор тега Hibernate
Седой и строгий
Criteria API. А ещë лучше фасетный поиск.
Ответ написан
Комментировать
azerphoenix
@azerphoenix
Java Software Engineer
Добрый день.
Если речь идет о поиске данных в БД и об уменьшении кол-ва кода, т.е. именованных методов, то можете использовать следующие решения
1 - Используйте спецификации. Создайте список предикатов и уже по ним проводите поиск в БД.
Простой пример
public Specification<User> applicationSpecification(
          // search arguments
) {
    return (root, query, criteriaBuilder) -> {
      List<Predicate> predicates = new ArrayList<>();
      if (StringUtils.isNotBlank(status)) {
        Predicate predicate = criteriaBuilder.like(// Your code here);
        predicates.add(predicate);
      }
      // other search conditions
      return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
    };
  }

2 - Используйзет готовые библиотеки. Например, https://github.com/tkaczmarzyk/specification-arg-r...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Вариант раз:
Попробуй что-то CQRS-подобное и для каждого типа запросов новый класс - обработчик.

Вариант два:
Попробуй поиграть с неймингом

Вариант три:
Паттерн "спецификация"

Вариант 4:
Если тебе просто нужно кучу параметров для поиска - сделай один метод с кучей параметров.

Вариант 5:
Если совсем разные запросы - и фильтры, и наборы полей - посмотри в сторону graphql
Ответ написан
Комментировать
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
делайте что то типа
q=test&params=sort__desc;filter__hr

Это для гета, то есть получаете строку и разбираете ее сами, на клиенте же формируете строку

Для поста просто формируете json или впихиваете нужные параметры в форму и на бэкенде проверяете пришли ли они.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы