使用Spring JPA或QueryDSL的动态搜索词SQL查询

问题描述 投票:0回答:1

我正在尝试学习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 / Spring查询框架动态创建contains(params [0])AND / OR contains(params [1] AND / OR ... contains(params [n])] >> ?我看到QueryDSL具有谓词系统,但我仍然不了解如何基于同一列中可变数量的参数搜索来动态创建查询。

我正在尝试学习QueryDSL,以便从Postgres返回单个搜索词的结果:@GetMapping(“ / product / contains / {matchingWords}”)public List ... ... >>] >>> < [

我知道了。这有点不直观,但是使用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;

java spring querydsl
1个回答
0
投票
我知道了。这有点不直观,但是使用BooleanBuilder和JPAQuery可以创建一个动态的布尔值系列,这些布尔值返回匹配项列表。例如:
© www.soinside.com 2019 - 2024. All rights reserved.