gpt4 book ai didi

java - 使用 Spring JPA 或 QueryDSL 进行动态搜索词 SQL 查询

转载 作者:行者123 更新时间:2023-12-01 16:55:32 25 4
gpt4 key购买 nike

我正在尝试学习 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 有一个谓词系统,但我仍然不明白如何根据在同一列中搜索的可变数量的参数动态创建查询。

最佳答案

我明白了。这有点不直观,但是使用 BooleanBuilderJPAQuery<?>您可以创建一系列动态 boolean 谓词,它们返回匹配列表。

示例:

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));
}

// then you can put together the query like so:
List<ProductModel> products = query.select(product)
.from(product)
.where(builder)
.fetch();

return products;

关于java - 使用 Spring JPA 或 QueryDSL 进行动态搜索词 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61598374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com