Java 如何向querydsl谓词添加比较器?
我有以下Web服务,自动将get参数查询转换为数据库选择: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
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实现可能更好。您能否给出一个使用egagegt
的示例?因为那将是我的Person.class
上没有的属性,那么我如何才能将其放入QPerson.class
中呢?@membersound请查看我的帖子(,),希望它们会有所帮助。关于第二个问题,如果个人
与另一个实体有关联,例如数据
包含年龄
属性,请尝试使用前缀数据来解决它。
,例如:数据.age
,可能会对您有所帮助。尽管如此,正如@AlanHay已经说过的,Querydsl并不是您任务的最佳解决方案,在我看来,最好使用规范/标准API来构建您自己的“查询语言”(参见我的第二个链接)。Spring数据不支持此类查询。您可以自定义绑定(并使用别名,例如agegt=18),但对于此类灵活的查询,OData(Olingo)或GraphQL实现可能更好。您能否给出一个使用egagegt
的示例?因为那将是我的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));
}
}