我知道Spring Data Common支持使用运算符(例如Between
,LessThan
,GreaterThan
,Like
作为属性表达式的查询(存储库中的方法)。
我想知道Data Rest是否也支持这些运营商?如果支持,使用这些运算符时Rest API URL会是什么样子。例如,如果我需要查询年龄介于20到30之间的人。
存储库中的查询应为List<Person> findByAgeBetween(Long min, Long max)
;
但是URL是什么?
我在春季参考文献中找不到与此问题相关的任何内容。
答案 0 :(得分:2)
Tl;是的,Spring Data Rest支持额外的约束。
如果您访问http://spring.io/guides?filter=spring-data%20rest,您会看到有关Spring Data Rest的几个指南。它们涵盖了几个数据存储。他们甚至展示定制发现者。实质上,您只受每个基础Spring Data项目支持的标准的约束。
Spring Data Rest只是将Web调用及其参数映射到您定义的存储库接口方法。实际上执行finder方法留给了底层的Spring Data项目。
最重要的是,你可以毫无问题地使用额外的标准。
答案 1 :(得分:1)
在1.1文档中,您可以找到this example:
以下内容将使用PersonRepository上定义的findByNameStartsWith查询方法,查找名称以字母“K”开头的所有Person实体,并添加按名称属性按降序排序结果的排序数据:
curl -v http://localhost:8080/people/search/nameStartsWith?name=K&sort=name&name.dir=desc
所以在你的情况下,它将是:
curl -v http://localhost:8080/person/search/ageBetween?min=xxx&max=yyy
答案 2 :(得分:1)
所以我在这里假设您拥有以下存储库:
interface PersonRepository extends CrudRepository<Person, Long> {
List<Person> findByAgeBetween(Long min, Long max);
}
基于此,您将获得以下资源:
persons
(我们默认使用复数库,但您可以使用@RepositoryRestResource
调整这些名称和路径。)search
的搜索资源。它包含指向各个查询方法资源的链接列表(参见下文)。每个查询方法的查询方法资源,如一般所述here。参数名称需要使用@Param
注释来定义,就像8之前的Java版本一样,接口方法不带有命名信息,因此我们无法找到它。这意味着改进的存储库声明将如下所示:
interface PersonRepository extends CrudRepository<Person, Long> {
List<Person> findByAgeBetween(@Param("min") Long min, @Param("max") Long max);
}
当您访问搜索资源时,这将导致以下输出:
_links : {
self : { href : "…" },
findByAgeBetween : {
href : "…/persons/search/findByAgeBetween{?min,max}",
templated : true
}
}
现在客户端会继续,找到名为findByAgeBetween
的链接,认识到它是RFC 6570 Uri template(通过HAL spec建议的templated
参数)并展开具有min
和max
的适当值的模板。
这里的重要方面是只要参数名称保持不变,服务器就可以自由更改URI结构。您可以继续使用路径变量而不是请求参数等。通过使用模板方法,客户端不需要知道结构。它一般只知道模板变量。
可以使用查询方法上的@RestResource
自定义链接名称和路径。