java – Spring – QueryDsl支持的高级比较器

official documentation之后,将@EnableSpringDataWebSupport注释添加到我的Spring配置允许在查询自动注入Predicate类:

@RequestMapping(method = RequestMethod.GET,path="/find")
public ResponseEntity

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

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

这很好用.但是我想知道如何实现更高级的搜索条件:

>>
><
>> =
>< =
通常,我想将这些运算符应用于数据模型中的数字和日期字段. Querydsl支持这些标准.

我尝试添加> (>)在我的查询参数中,但它无法解析(例如,对于数字字段,如年龄,它抱怨它不能解析> 10作为数字.

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

(如果重要的话我正在使用Spring Data Mongodb)

最佳答案
自定义查询DSL绑定 – 大于比较

您可以做的是通过扩展QueryDslPredicateExecutor和QuerydslBinderCustomizer在您的存储库中定义您自己的QueryDSL Binding:

public interface FooRepository
        extends CrudRepositoryirst(singleBinding);
    }
}

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

a binding defines how a specific field is to be compared to its
database column.

与java 8 lambda相同的绑定:(path,ageValue) – > path.gt(ageValue).您必须从url参数的角度阅读customize方法中的代码

fetch the Foos for which the age provided as parameter is greater than
the database’s value.

自定义查询DSL绑定 – 比较之间

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

default void customize(final QuerydslBindings bindings,final QFoo foo) {
    bindings.bind(foo.age).all((path,ageValue) -> {
        Iteratorterator();
        return path.between(it.next(),it.next());
    });
}

相关文章

这篇文章主要介绍了spring的事务传播属性REQUIRED_NESTED的原...
今天小编给大家分享的是一文解析spring中事务的传播机制,相...
这篇文章主要介绍了SpringCloudAlibaba和SpringCloud有什么区...
本篇文章和大家了解一下SpringCloud整合XXL-Job的几个步骤。...
本篇文章和大家了解一下Spring延迟初始化会遇到什么问题。有...
这篇文章主要介绍了怎么使用Spring提供的不同缓存注解实现缓...