我使用Spring Data Rest 2.1.1 Release和默认配置。考虑以下资源:
GET /communities/MyCommunity
{
"creationDate": "2014-07-16T06:22:37.153+0000",
"name": "GroupeSEB",
"_links": {
"self": {
"href": "http://localhost:8080/api/communities/GroupeSEB"
},
"posts": {
"href": "http://localhost:8080/api/communities/GroupeSEB/posts"
}
}
}
当我收到“帖子”子资源时:
GET /communities/MyCommunity/posts
{
"_embedded": {
"posts": [
{
"creationDate": "2014-07-09T13:09:14.535+0000",
"id": "53bd3efae4b012818368c549",
"_links": {
"self": {
"href": "http://localhost:8080/api/posts/53bd3efae4b012818368c549"
}
}
}
]
}
}
未启用分页功能。由于我的父资源可以聚合大量帖子(其子资源),我如何为每个子资源启用分页?
答案 0 :(得分:3)
奥利弗(Oliver)给出的答案并不完全正确。
在EAGER嵌套实体(集合)上,没有存储库用法。但是在LAZY嵌套实体(集合)上有 IS 存储库用法。 @ One2Many默认为LAZY。因此,在检索父实体时,不会填充嵌套实体,也不会从回购中检索嵌套实体。嵌套实体仅在其在会话中访问时才被填充。 在Spring Data REST中,父实体列表永远不会访问嵌套实体。通过嵌套实体访问URL来访问嵌套LAZY实体时。 / communities / GroupeSEB / posts 是访问的嵌套对象,并且由于该嵌套对象不是将导致从回购中检索的对象的对象实例BUT LazyProxy。 好的,嵌套对象可以从仓库的仓库中获取,但是我认为可以禁止在嵌套实体/对象上进行缓存。
因此,如果有一种方法可以通过/检索LazyProxy实现上的分页信息,则可以使用。
P.S。我在@ One2Many和@ Many2One之间进行双向导航并防止N + 1列出父母时从我的经验中得知,我设置了@ManyToOne(fetch = FetchType.LAZY),然后在repo接口中覆盖了相关的findbyId()使用@NamedEntityGraph检索时,强制将嵌套嵌套到EAGER的@NamedEntityGraph。这并不直接适用于此问题,但确实证明了在春季数据中可以对重新设置的实体进行控制。
答案 1 :(得分:1)
答案很简单:你不能。以下是基本原理:
关联资源表示主要实体与一个或多个其他实体之间的关联。因此,为了呈现这些资源,我们查找主要实体并只访问该属性。这意味着,没有存储库使用,并且不能应用地点分页,因为整个机制与存储无关。我们对实体实例进行操作加载关联的机制是高度特定于商店的。
因此,如果您的域模型中有对象关联,那么您完全受商店处理关联的方式约束。因此,即使您应用了分页,您也必须首先阅读所有相关对象以获取其ID。
作为一种解决方法,您可以只回退到id并在该路径上手动公开资源,该资源将使用相关实体的存储库中的ID和专用查询方法。