【问题标题】:Dynamic search term SQL query with Spring JPA or QueryDSL使用 Spring JPA 或 QueryDSL 进行动态搜索词 SQL 查询
【发布时间】:2020-05-04 17:42:31
【问题描述】:

我正在尝试学习 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("[+]");

如何使用 QueryDSL 或任何 Java 动态创建 contains(params[0]) AND/OR contains(params[1] AND/OR ... contains(params[n]) /Spring查询框架?我看到QueryDSL有一个谓词系统,但是我还是不明白如何根据在同一列中搜索的可变数量的参数动态创建查询。

【问题讨论】:

    标签: java spring querydsl


    【解决方案1】:

    我想通了。这有点不直观,但使用 BooleanBuilder 和 JPAQuery 您可以创建一系列动态的布尔值,返回匹配列表。例如:

         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;
    

    【讨论】:

    • 您可以使用Stream.of(matchingWords.split("[+]")).map(param -&gt; product.title.containsIgnoreCase(param)).reduce(Predicate::or).get()将其转换为一个衬里
    猜你喜欢
    • 2014-10-14
    • 2017-04-06
    • 2023-01-02
    • 2012-07-25
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 2018-11-19
    • 2014-03-29
    相关资源
    最近更新 更多