簡體   English   中英

如何向querydsl Predicate添加比較器?

[英]How to add a comparator to querydsl Predicate?

我有以下 Web 服務,可自動將獲取參數查詢轉換為數據庫選擇:

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

問題:我怎么能做到這一點? 至少后面的查詢不起作用。

我通過為該字段定義占位符並使用QuerydslBinderCustomizer找到了一個解決方案:

public interface PersonRepo extends
        JpaRepository<Person, Long>,
        QuerydslPredicateExecutor<Person>,
        QuerydslBinderCustomizer<Person> {
    default void customize(final QuerydslBindings bindings, final QPerson person) {
        bindings.bind(cache.ageMin).first((path, value) -> person.age.goe(value));
        bindings.bind(cache.ageMax).first((path, value) -> person.age.loe(value));
    }
}

當然,年齡字段必須作為臨時字段存在,以便 querydsl 知道它們:

@Entity
class Person {
    @Transient
    @QueryType(PropertyType.NUMERIC)
    public int ageMin;

    @Transient
    @QueryType(PropertyType.NUMERIC)
    private int ageMax;
}

您可以使用單個綁定並使用來自Query 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));
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM