Spring Boot JPA CrudRepository, как сделать необязательные параметры поиска - PullRequest
0 голосов
/ 17 апреля 2020

Для класса ниже, где я добавляю дополнительные методы поиска в хранилище, как мне сделать параметры поиска необязательными в методе findByFields? Этот метод имеет только два параметра, но рассмотрим сценарий с гораздо более широкими возможностями.

Примером сценария является страница формы поиска, где может быть от 10 до 20 фильтров поиска. Пользователь может использовать любую комбинацию 0 для всех параметров поиска.

Есть ли способ сделать поля необязательными в том смысле, что если задано нулевое значение, то это поле не будет добавлено в качестве фильтра запроса?

Я знаю, что я мог бы добавить logi c внутри метода, чтобы сказать, если paramA и paramB имеют значения, затем вызвать метод для этой комбинации и вызвать другой метод для другой комбинации, но это было бы ужасным решением в Мое мнение.

Есть предложения? Было бы неплохо сделать это без добавления оператора запроса вручную.


import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;

import java.util.List;

public interface ReportMappingRepository extends CrudRepository<ReportMapping, Integer> {

    public ReportMapping findReportMappingByReportId(@Param("reportID") int reportId);

    public List<ReportMapping> findByFields(@Param("id")int id, @Param("reportID") int reportId);

}

1 Ответ

0 голосов
/ 26 апреля 2020

Я решил это, используя спецификацию JPA, спасибо Eklavya за указание на правильное направление.

Изменен репозиторий для расширения JpaSpecificationExecutor.

import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;

public interface ReportMappingRepository extends CrudRepository<ReportMapping, Integer>, JpaSpecificationExecutor<ReportMapping> {

}

Созданные критерии поиска и классы операций поиска затем были выполнены запрос так.

    // Build up Search Criteria Specification
    // Id
    ReportMappingSpecification searchSpec = new ReportMappingSpecification();
    if (queryForm.getId() != null && queryForm.getId().length() > 0) {
        searchSpec.add(new SearchCriteria("id", queryForm.getId(), SearchOperation.EQUAL));
    }
    // reportId
    if (queryForm.getReportId() != null && queryForm.getReportId().length() > 0 && !queryForm.getReportId().equalsIgnoreCase("0")) {
        searchSpec.add(new SearchCriteria("reportId", queryForm.getReportId(), SearchOperation.EQUAL));
    }

    // Run search
    reportMappingRepo.findAll(searchSpec).forEach(reportMappings::add);

Надеюсь, это поможет кому-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...