QueryDSL:从实体构建查询

时间:2016-02-08 08:35:40

标签: java spring spring-boot spring-data querydsl

我刚刚开始将QueryDSL集成到Spring Boot项目中,我正在寻找一种从现有实体bean构建查询的方法。使用@ModelAttribute只要参数与bean对齐,就可以通过控制器的GET请求传递实体,这很好,很容易:

public Page<Company> getLogins(@ModelAttribute Company company, Pageable pageable, @RequestParam(value = "page", required = false) String pageNumber){
    return companyService.findbyParameters(company,pageNumber);

}

在服务类中,我可以使用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));
    }

..这很好用。但它似乎是一个不必要的管道,因为我将不得不为我正在使用的每个实体编写类似的,longwinded条件代码。我认为反射可能是一种选择,但我不确定QueryDSL是否内置了处理这种情况的内容。我查看了QueryDSL文档,没有任何内容跳出来。

那么有没有一种漂亮,整洁的方法来处理这种情况而不会用样板文件堵塞我的服务类?

2 个答案:

答案 0 :(得分:0)

您可以使用Spring Data的QueryDSL集成。基本上,您在存储库界面中扩展QueryDslPredicateExecutor,并添加findAll方法,该方法获取QueryDSL Predicate并根据Predicate过滤所有结果。您会看到更多详细信息here

答案 1 :(得分:0)

事实证明,我要查找的确切内容是通过示例API查询Spring Data。

https://www.baeldung.com/spring-data-query-by-example

它允许您通过提供一个示例实体和一个匹配器来创建查询,该匹配器定义了区分大小写,部分“喜欢”匹配等内容。

在有限的情况下非常有用,并且可以大大减少样板查询代码;但是当您要查询更复杂的数据图时,您将希望使用其他方法。