【问题标题】:QueryDSL: building a query from an entityQueryDSL:从实体构建查询
【发布时间】:2016-02-08 08:35:40
【问题描述】:

我刚刚开始将 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));
    }

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

那么有没有一种很好、整洁的方法来处理这种情况,而不会用样板代码阻塞我的服务类?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 有用,但不是我想要的。我正在寻找一种基于 any 实体 bean 的通用查询方式,而无需手动构建查询。
    【解决方案2】:

    事实证明,我正在寻找的正是 Spring Data 通过示例 API 进行的查询。

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-04-27
      • 1970-01-01
      • 2017-04-08
      • 2014-07-13
      • 1970-01-01
      • 2015-04-12
      • 1970-01-01
      • 2015-10-18
      • 1970-01-01
      相关资源
      最近更新 更多