一尘不染

Spring Data REST的QueryDSL集成可以用于执行更复杂的查询吗?

spring

我目前正在构建一个REST API,我希望客户端可以在其中轻松过滤特定实体的大多数属性。通过将QueryDSL与Spring Data REST结合使用,我可以通过允许客户端通过组合引用属性(例如/users?firstName=Dennis&lastName=Laumen)的查询参数进行过滤,轻松达到我想要的90%。

我什至可以通过实现QuerydslBinderCustomizer接口来自定义查询参数与实体属性之间的映射(例如,不区分大小写的搜索或部分字符串匹配)。一切都很好,但是我也希望客户端能够使用范围过滤某些类型。例如,关于诸如出生日期之类的属性,我想执行以下操作/users?dateOfBirthFrom=1981-1-1&dateOfBirthTo=1981-12-31。基于数字的属性也是如此/users?idFrom=100&idTo=200。我觉得使用QuerydslBinderCustomizer接口应该可以实现这一点,但是这两个库之间的集成并未得到广泛的记录。

最后,使用Spring Data REST和QueryDSL是否可能?如果是这样,怎么办?


阅读 427

收藏
2020-04-15

共1个答案

一尘不染

我认为你应该可以使用以下定制功能使它起作用:

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-property中,User以便Spring能够正确地将输入内容Strings转换为LocalDate实例。

目前,lambda得到了a Collection<? extends T>,这使理清各个元素变得更加痛苦,但我认为我们可以在将来的版本中对此进行更改以更合理地暴露a List

2020-04-15