当前位置: 首页 > 知识库问答 >
问题:

支持QueryDsl的Spring-Advanced比较器

公良文彬
2023-03-14

按照官方文档,在我的Spring配置中添加@enableSpringDataWebSupport注释允许在查询中自动插入谓词类:

@RequestMapping(method = RequestMethod.GET, path="/find")
public ResponseEntity<PagedResources<FooResource>> find(Pageable pageable, PagedResourcesAssembler<Foo> assembler, @QuerydslPredicate(root = Foo.class) Predicate predicate) {
    Page<Foo> foos = fooRepository.findAll(predicate, pageable)
    final ResourceAssemblerSupport<Foo, FooResource> fooResourceAssembler = new ....;
    final PagedResources<FooResource> pagedResources = assembler.toResource(foos, fooResourceAssembler);
    return new ResponseEntity<>(pagedResources, HttpStatus.OK);
}

然后我可以在执行GET请求时轻松地进行搜索:

GET /foo/name?=bob&name=alice&age=20
    null

是否可以在查询中直接使用此运算符?

(如果有关系的话,我使用的是Spring Data Mongodb)

共有1个答案

赵立果
2023-03-14

自定义查询DSL绑定-大于比较

您可以通过扩展QueryDSLPredicateExecutorQueryDSLBinderCustomizer,在存储库中定义自己的QueryDSL绑定:

public interface FooRepository
        extends CrudRepository<Foo, Integer>, QueryDslPredicateExecutor<Foo>, QuerydslBinderCustomizer<QFoo> {

    default void customize(final QuerydslBindings bindings, final QFoo foo) {
        SingleValueBinding<NumberPath<Integer>, Integer> singleBinding = new SingleValueBinding<NumberPath<Integer>,Integer>(){
            @Override
            public Predicate bind(NumberPath<Integer> path, Integer ageValue) {
                return path.gt(ageValue);
            }
        };

        bindings.bind(foo.age).first(singleBinding);
    }
}

我不是查询DSL专家,但我的理解是:

另一种选择是为参数提供下限和上限,如下所示:?age=10&age=30。然后,定义以下绑定:

default void customize(final QuerydslBindings bindings, final QFoo foo) {
    bindings.bind(foo.age).all((path, values) -> {
        Iterator<? extends Long> it = values.iterator();
        return path.between(it.next(), it.next());
    });
}
 类似资料:
  • 我想使用具有QueryDSL支持的Spring Data JDBC。根据Spring留档(https://docs.spring.io/spring-data/jdbc/docs/current/reference/html/#core.extensions.querydsl),它是受支持的,但我无法使其工作。 我使用MariaDB作为数据库,我的SpringBoot版本是2.6.0。 我对pom

  • 问题 你想让某个类的实例支持标准的比较运算(比如>=,!=,<=,<等),但是又不想去实现那一大丢的特殊方法。 解决方案 Python类对每个比较操作都需要实现一个特殊方法来支持。 例如为了支持>=操作符,你需要定义一个 __ge__() 方法。 尽管定义一个方法没什么问题,但如果要你实现所有可能的比较方法那就有点烦人了。 装饰器 functools.total_ordering 就是用来简化这个

  • 我使用querydsl来构造动态搜索查询(并使用spring data mongodb API来执行它)。是否有一种方法可以构造支持$text(全文)搜索的querydsl查询?

  • 本文向大家介绍Git 比较分支,包括了Git 比较分支的使用技巧和注意事项,需要的朋友参考一下 示例 显示的尖端new与的尖端之间的变化original: 显示上的所有更改new,因为它从支original: 仅使用一个参数,例如 git diff原始 相当于 git diff原始的..HEAD