Spring Data Rest 2.1中的Paginate子资源

时间:2014-07-16 08:16:03

标签: spring pagination spring-data-rest

我使用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"
                    } 
                }
            }
        ]
    }
}

未启用分页功能。由于我的父资源可以聚合大量帖子(其子资源),我如何为每个子资源启用分页?

2 个答案:

答案 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和专用查询方法。