QueryDSL:从实体构建查询
QueryDSL: building a query from an entity
我刚刚开始将 QueryDSL 集成到 Spring 引导项目中,并且我正在寻找一种从现有实体 bean 构建查询的方法。使用 @ModelAttribute
通过来自控制器的 GET 请求传递一个实体很好很容易,只要参数与 bean 一致即可:
public Page<Company> getLogins(@ModelAttribute Company company, Pageable pageable, @RequestParam(value = "page", required = false) String pageNumber){
return companyService.findbyParameters(company,pageNumber);
}
并且在服务 class 中,我可以使用 BooleanBuilder 构建查询:
public Page<Company> findbyParameters(Company companySearch,String pageNumber){
QCompany company = QCompany.company;
BooleanBuilder builder = new BooleanBuilder();
if (companySearch.getEmail() != null && !companySearch.getEmail().equals("")){
builder.and(company.email.eq(companySearch.getEmail()));
}
if (companySearch.getCompanyName() != null && !companySearch.getCompanyName().equals("")){
builder.and(company.companyName.eq(companySearch.getCompanyName()));
}
//add other clauses...
return loginRepository.findAll(builder.getValue(),pageableService.getPageRequest(pageNumber));
}
..这很好用。但这似乎是不必要的管道,因为我将不得不为我正在使用的每个实体编写类似的、冗长的条件代码。我认为反射可能是一种选择,但我不确定 QueryDSL 是否有内置的东西来处理这种情况。我查看了 QueryDSL 文档,但没有发现任何问题。
那么,有没有一种很好、整洁的方法来处理这种情况,而不会阻塞我的服务 classes 与样板文件?
您可以使用 Spring 数据的 QueryDSL
集成。基本上,您在存储库界面中扩展 QueryDslPredicateExecutor
并添加一个 findAll
方法来获取 QueryDSL Predicate
并根据该 Predicate
过滤所有结果。您会看到更多详细信息。
事实证明,我正在寻找的正是Spring数据的示例查询API。
https://www.baeldung.com/spring-data-query-by-example
它允许您通过提供示例实体和定义区分大小写、部分 'like' 匹配等内容的匹配器来创建查询。
它在有限的情况下非常有用,可以大大减少样板查询代码;但是当您想要查询更复杂的数据图时,您将需要使用不同的方法。
我刚刚开始将 QueryDSL 集成到 Spring 引导项目中,并且我正在寻找一种从现有实体 bean 构建查询的方法。使用 @ModelAttribute
通过来自控制器的 GET 请求传递一个实体很好很容易,只要参数与 bean 一致即可:
public Page<Company> getLogins(@ModelAttribute Company company, Pageable pageable, @RequestParam(value = "page", required = false) String pageNumber){
return companyService.findbyParameters(company,pageNumber);
}
并且在服务 class 中,我可以使用 BooleanBuilder 构建查询:
public Page<Company> findbyParameters(Company companySearch,String pageNumber){
QCompany company = QCompany.company;
BooleanBuilder builder = new BooleanBuilder();
if (companySearch.getEmail() != null && !companySearch.getEmail().equals("")){
builder.and(company.email.eq(companySearch.getEmail()));
}
if (companySearch.getCompanyName() != null && !companySearch.getCompanyName().equals("")){
builder.and(company.companyName.eq(companySearch.getCompanyName()));
}
//add other clauses...
return loginRepository.findAll(builder.getValue(),pageableService.getPageRequest(pageNumber));
}
..这很好用。但这似乎是不必要的管道,因为我将不得不为我正在使用的每个实体编写类似的、冗长的条件代码。我认为反射可能是一种选择,但我不确定 QueryDSL 是否有内置的东西来处理这种情况。我查看了 QueryDSL 文档,但没有发现任何问题。
那么,有没有一种很好、整洁的方法来处理这种情况,而不会阻塞我的服务 classes 与样板文件?
您可以使用 Spring 数据的 QueryDSL
集成。基本上,您在存储库界面中扩展 QueryDslPredicateExecutor
并添加一个 findAll
方法来获取 QueryDSL Predicate
并根据该 Predicate
过滤所有结果。您会看到更多详细信息
事实证明,我正在寻找的正是Spring数据的示例查询API。
https://www.baeldung.com/spring-data-query-by-example
它允许您通过提供示例实体和定义区分大小写、部分 'like' 匹配等内容的匹配器来创建查询。
它在有限的情况下非常有用,可以大大减少样板查询代码;但是当您想要查询更复杂的数据图时,您将需要使用不同的方法。