你可以看看Query http://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/Query.htmlSpring Data 的注释。它使您能够执行自定义查询,而无需自定义控制器。
Edit:
查询参数是通过简单属性过滤资源的好方法。由于 SDR 将所有复杂类型序列化为关系,因此更清楚的是,过滤仅适用于其余(简单)属性。
如果您只有一种关系,那么您正确地提到了进行“反向”搜索的方法,正如您所说的那样/users/1/orders
.
如果您想通过多个关系进行搜索,我建议您定义一个单独的搜索(子)资源,并通过向该资源发出 POST 请求来执行搜索。
例如:
POST /orders/search
{
"user": "http://example.org/users/1",
...
}
这样,SDR 就会正确地将 URI 转换为实体。但是,我认为您需要在此处使用自定义控制器,但仍然可以使用 Spring 数据存储库并提供用户和其他实体作为参数。
有关更多信息,请参阅以下 SO 问题:
如何设计 RESTful 搜索/过滤? https://stackoverflow.com/questions/5020704/how-to-design-restful-search-filtering/18933902#18933902
用于搜索的 RESTful URL 设计 https://stackoverflow.com/questions/207477/restful-url-design-for-search
Edit2:
解决使用 POST 进行搜索违反 REST 规范的问题:
REST 的设计很简单。 REST 的主要优点之一是您不会被迫做任何事情。您可以调整规范,直到它满足您的需求。当然,这可能意味着您的 API 不太 RESTful,但您应该考虑是否值得严格遵守规范,如果它会给 API 的使用者带来不必要的开销。
当然你可以按照上面的思路来设计,完全满足REST规范。这将涉及创建一个单独的搜索实体,将其保存到数据库,然后通过调用子资源来检索搜索结果,例如/result
或类似的东西。然而,问题是,是否值得。
在您的具体示例中,我只要求客户端解析链接中的 ID 并将其作为查询参数提供。如果您稍后要扩展应用程序,则可以引入命名搜索等功能并应用上述解决方案。