QueryDSL многопараметрический поиск, при создании запроса пропустить предикат, когда значение равно нулю - PullRequest
0 голосов
/ 03 июня 2019

Я работаю над веб-приложением Spring Boot с QueryDSL JPA.У меня есть REST API, где я получаю ввод данных от пользователей.Я должен выполнить многопараметрический поиск.Если значение inpu пользователя равно нулю (что нормально, потому что не все поля обязательны для заполнения), мой конструктор запросов должен пропустить это значение при запросе базы данных.

В моей части QueryDSL я получаю объект, например «Решение», он может выглядеть так:

ticketNumber: 4261 (целое число)
errorFlag: false (логическое значение)
statusOCIA: null (строка)
описание: «Erorr при нажатии на изображение» (строка)

Я пытался динамически построить запрос с помощью PathBuilder и BooleanBuilder из QueryDSL:

    public List<Solution> findSolutionBySolutionQuerydsl(Solution searchSolution) {


    QSolution solution = QSolution.solution;
    JPAQuery<?> query = new JPAQuery<Void>(em);


    BooleanBuilder builder = new BooleanBuilder();
    PathBuilder<QSolution> QentityPath = new PathBuilder<QSolution>(QSolution.class, "solution");
    PathBuilder<Solution> entityPath = new PathBuilder<Solution>(Solution.class, "serachSolution");

    Field[] fields = searchSolution.getClass().getDeclaredFields();


    for (Field attr : fields) {

        if (searchSolution."here it should perform searchSolution.getTicketNumber or searchSolution.getDiscription depending on what attr.getName is"  != null) {
            builder.or(QentityPath.get(attr.getName()).eq(entityPath.get(attr.getName())));

        }
    }

    List<Solution> s1 = query.select(solution)
            .from(solution)
            .where(builder)
            .fetch();

    System.out.println(("query: " + s1));

    return s1;

}

Я хочу, чтобы это работало так: если attr.getName равно «description», он должен выполнить searchSolution.getDescription.

Я пробовал кое-что с HashMap или ArrayList, но потерпел неудачу из-за различных типов данных в моем объекте.

Надеюсь, кто-нибудь может мне помочь.

1 Ответ

0 голосов
/ 06 июня 2019

Попробуйте поставить эту проверку в условии if

entityPath.get(attr.getName()) != null

чтобы сделать это

if (entityPath.get(attr.getName()) != null) {

    builder.or(QentityPath.get(attr.getName()).eq(entityPath.get(attr.getName())));
}
...