首页 > 解决方案 > 如何向querydsl Predicate添加比较器?

问题描述

我有以下网络服务,可自动将获取参数查询转换为数据库选择:

public interface PersonRepo extends
        JpaRepository<Person, Long>,
        QuerydslPredicateExecutor<Person> {

}

@GetMapping
public ResponseEntity getFiltered(
    @QuerydslPredicate(root = Person.class) Predicate predicate, Pageable pageable) {
       return ResponseEntity.ok(personRepo.findAll(predicate, pageable)));
    )
}

例如可以执行以下查询:

GET /people?name=John&age=18
GET /people?name=John&age=18&page=1&sort=name,desc

问题:我想按如下方式应用比较器查询:

GET /people?name=John&age>18
GET /people?name=John&age>18&age<30
GET /people?name=John&age<30

问题:我怎么能做到这一点?至少后面的查询不起作用。

标签: javaspringspring-data-jpaspring-data-restquerydsl

解决方案


您可以使用单个绑定并使用查询 DSL 值运算符中的表达式。

public interface PersonRepo extends
    JpaRepository<Person, Long>,
    QuerydslPredicateExecutor<Person>,
    QuerydslBinderCustomizer<Person> {
    default void customize(final QuerydslBindings bindings, final QPerson person) {
        bindings.bind(cache.age).all((path, values) -> ExpressionProviderFactory.getPredicate(path, values));
    }
}

推荐阅读