Динамический c поисковый запрос SQL запрос с использованием Spring JPA или QueryDSL - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь изучить QueryDSL, чтобы вернуть результаты одного поискового запроса из Postgres:

    @GetMapping("/product/contains/{matchingWords}")
    public List<ProductModel> findByTitleContaining(@PathVariable String matchingWords) {

        QProductModel product = QProductModel.productModel;
        JPAQuery<?> query = new JPAQuery<>(em);

        List<ProductModel> products = query.select(product)
                .from(product)
                .where(product.title.toLowerCase()
                        .contains(matchingWords.toLowerCase()))
                .fetch();
        return products;
    }

Но я также хочу найти любое количество поисковых запросов, например: скажем, это мой список поисковых терминов, разделенных символом плюса:

   String[] params = matchingWords.split("[+]");

Как я могу динамически создать содержит (параметры [0]) И / ИЛИ содержит (параметры [1] И / ИЛИ ... содержит (params [n]) с использованием QueryDSL или любой инфраструктуры запросов Java / Spring? Я вижу, что QueryDSL имеет систему предикатов, но я все еще не понимаю, как динамически создавать запрос на основе переменного числа поиск параметров в одном столбце.

1 Ответ

0 голосов
/ 04 мая 2020

Я понял это. Это немного не интуитивно понятно, но используя BooleanBuilder и JPAQuery, вы можете создать динамическую серию логических выражений c, которые возвращают список совпадений. Пример:

     QProductModel product = QProductModel.productModel;
     JPAQuery<?> query = new JPAQuery<>(//entity manager goes here//);

     // example list of search parameters separated by +
     String[] params = matchingWords.split("[+]");

     BooleanBuilder builder = new BooleanBuilder();
     for(String param : params) {
         builder.or(product.title.containsIgnoreCase(param));
     }

Что вы можете затем собрать так:

     List<ProductModel> products = query.select(product)
          .from(product)
          .where(builder)
          .fetch();

     return products;
...