我目前正在构建一个 REST API,希望客户端能够轻松过滤特定实体的大多数属性。使用QueryDSL http://querydsl.com/结合春季数据休息 http://projects.spring.io/spring-data-rest/ (奥利弗·吉尔克(Oliver Gierke)的一个例子 https://gist.github.com/olivergierke/decf03d4948cd58a51bc)允许客户端通过组合引用属性的查询参数(例如/users?firstName=Dennis&lastName=Laumen
).
我什至可以通过实现来自定义查询参数和实体属性之间的映射QuerydslBinderCustomizer
接口(例如,用于不区分大小写的搜索或部分字符串匹配)。这一切都很棒,但是我也希望客户端能够使用范围过滤某些类型。例如,对于诸如出生日期之类的属性,我想做类似以下的事情,/users?dateOfBirthFrom=1981-1-1&dateOfBirthTo=1981-12-31
。基于数字的属性也是如此,/users?idFrom=100&idTo=200
。我觉得这应该可以使用QuerydslBinderCustomizer
接口,但是这两个库之间的集成没有非常广泛的记录。
最后,使用 Spring Data REST 和 QueryDSL 可以实现这一点吗?如果是这样,怎么办?
我认为您应该能够使用以下自定义来使其工作:
bindings.bind(user.dateOfBirth).all((path, value) -> {
Iterator<? extends LocalDate> it = value.iterator();
return path.between(it.next(), it.next());
});
这里的关键是使用?dateOfBirth=…&dateOfBirth=
(使用该属性两次)和….all(…)
绑定将使您能够访问所提供的所有值。
确保您添加了@DateTimeFormat
注释到dateOfBirth
- 财产User
这样Spring就能够将传入的Strings
into LocalDate
实例正确。
lambda 目前得到一个Collection<? extends T>
这使得理清各个元素变得更加痛苦,但我认为我们可以在未来的版本中改变这一点,而不是暴露一个List
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)