Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何向querydsl谓词添加比较器?_Java_Spring_Spring Data Jpa_Spring Data Rest_Querydsl - Fatal编程技术网

Java 如何向querydsl谓词添加比较器?

Java 如何向querydsl谓词添加比较器?,java,spring,spring-data-jpa,spring-data-rest,querydsl,Java,Spring,Spring Data Jpa,Spring Data Rest,Querydsl,我有以下Web服务,自动将get参数查询转换为数据库选择: public interface PersonRepo extends JpaRepository<Person, Long>, QuerydslPredicateExecutor<Person> { } @GetMapping public ResponseEntity getFiltered( @QuerydslPredicate(root = Person.cla

我有以下Web服务,自动将get参数查询转换为数据库选择:

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&age<30
GET /people?name=John&age<30
GET/people?name=John&age>18岁

GET/people?name=John&age>18&age我通过为字段定义占位符并使用
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));
    }
}

我通过为字段定义占位符并使用
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));
    }
}

您可以使用单个绑定并使用来自的表达式

公共接口PersonRepo扩展
JpaRepository,
QueryDSL谓词执行器,
QuerydslBinderCustomizer{
默认void自定义(最终QuerydslBindings绑定,最终QPerson人员){
bindings.bind(cache.age).all((路径,值)->ExpressionProviderFactory.getPredicate(路径,值));
}
}

您可以使用单个绑定并使用来自的表达式

公共接口PersonRepo扩展
JpaRepository,
QueryDSL谓词执行器,
QuerydslBinderCustomizer{
默认void自定义(最终QuerydslBindings绑定,最终QPerson人员){
bindings.bind(cache.age).all((路径,值)->ExpressionProviderFactory.getPredicate(路径,值));
}
}

Spring数据不支持此类查询。您可以自定义绑定(并使用别名,例如agegt=18),但对于此类灵活的查询,OData(Olingo)或GraphQL实现可能更好。您能否给出一个使用eg
agegt
的示例?因为那将是我的
Person.class
上没有的属性,那么我如何才能将其放入
QPerson.class
中呢?@membersound请查看我的帖子(,),希望它们会有所帮助。关于第二个问题,如果
个人
与另一个实体有关联,例如
数据
包含
年龄
属性,请尝试使用前缀
数据来解决它。
,例如:
数据.age
,可能会对您有所帮助。尽管如此,正如@AlanHay已经说过的,Querydsl并不是您任务的最佳解决方案,在我看来,最好使用规范/标准API来构建您自己的“查询语言”(参见我的第二个链接)。Spring数据不支持此类查询。您可以自定义绑定(并使用别名,例如agegt=18),但对于此类灵活的查询,OData(Olingo)或GraphQL实现可能更好。您能否给出一个使用eg
agegt
的示例?因为那将是我的
Person.class
上没有的属性,那么我如何才能将其放入
QPerson.class
中呢?@membersound请查看我的帖子(,),希望它们会有所帮助。关于第二个问题,如果
个人
与另一个实体有关联,例如
数据
包含
年龄
属性,请尝试使用前缀
数据来解决它。
,例如:
数据.age
,可能会对您有所帮助。尽管如此,正如@AlanHay已经说过的,Querydsl并不是完成任务的最佳解决方案,在我看来,最好使用规范/标准API来构建自己的“查询语言”(参见我的第二个链接)。
@Entity
class Person {
    @Transient
    @QueryType(PropertyType.NUMERIC)
    public int ageMin;

    @Transient
    @QueryType(PropertyType.NUMERIC)
    private int ageMax;
}
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));
    }
}