使用 Spring JPA 或 QueryDSL 的动态搜索词 SQL 查询
Dynamic search term SQL query with Spring JPA or QueryDSL
我正在尝试学习 QueryDSL,以便 return 来自 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("[+]");
如何动态创建 contains(params[0]) AND/OR contains(params[1] AND/OR ... contains(params[n]) 使用 QueryDSL 或任何 Java/Spring 查询框架?我看到 QueryDSL 有一个谓词系统,但我仍然不明白如何根据在同一列中搜索的可变数量的参数动态创建查询。
我明白了。这有点不直观,但是使用 BooleanBuilder 和 JPAQuery 您可以创建一个动态的布尔值系列,其中 return 是一个匹配列表。例如:
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;
我正在尝试学习 QueryDSL,以便 return 来自 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("[+]");
如何动态创建 contains(params[0]) AND/OR contains(params[1] AND/OR ... contains(params[n]) 使用 QueryDSL 或任何 Java/Spring 查询框架?我看到 QueryDSL 有一个谓词系统,但我仍然不明白如何根据在同一列中搜索的可变数量的参数动态创建查询。
我明白了。这有点不直观,但是使用 BooleanBuilder 和 JPAQuery 您可以创建一个动态的布尔值系列,其中 return 是一个匹配列表。例如:
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;