Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对SpringDataREST2.1中的子资源进行分页_Spring_Pagination_Spring Data Rest - Fatal编程技术网

对SpringDataREST2.1中的子资源进行分页

对SpringDataREST2.1中的子资源进行分页,spring,pagination,spring-data-rest,Spring,Pagination,Spring Data Rest,我使用带有默认配置的SpringDataREST2.1.1版本。考虑到下列资源: GET /communities/MyCommunity { "creationDate": "2014-07-16T06:22:37.153+0000", "name": "GroupeSEB", "_links": { "self": { "href": "http://localhost:8080/api/communities/GroupeS

我使用带有默认配置的SpringDataREST2.1.1版本。考虑到下列资源:

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"
        }
    }
}
当我获得“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"
                    } 
                }
            }
        ]
    }
}

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

答案很简单:你不能。理由如下:

关联资源表示主实体与一个或多个其他实体之间的关联。因此,要呈现这些资源,我们需要查找主实体并只访问属性。这意味着,不会使用存储库,也不会应用位置分页,因为整个机制与存储无关。我们在实体实例上操作,如何加载关联的机制是高度特定于存储的

因此,如果您的域模型中已经存在对象关联,那么您将完全遵循存储处理关联的方式。因此,即使应用了分页,也必须首先读取所有相关对象才能获得它们的ID


作为一种解决方法,您可以仅使用ids并手动公开该路径上的资源权限,该路径将使用ids和相关实体存储库上的专用查询方法。

Oliver给出的答案并不完全正确

在嵌套实体(集合)上,没有存储库使用。但在惰性嵌套实体(集合)上,存在存储库使用情况@默认情况下,One2Many是懒惰的。因此,在检索父实体时,不会填充嵌套实体,也不会从repo检索嵌套实体。只有在会话中访问嵌套实体时,才会填充该实体。 在Spring数据中,父实体的REST列表从不访问嵌套实体。当通过嵌套实体访问URL ie访问嵌套的惰性实体时。 /社区/群体EB/职位 是否访问嵌套对象,因为该嵌套对象不是对象实例,而是将导致从repo检索的对象的懒散代理。 好的,嵌套对象可以从Repo的Repo层缓存insead中检索,但是我认为可以禁止嵌套实体/对象上的缓存

因此,如果有一种方法可以在LazyProxy实现上传递/检索分页信息,那么这可能会起作用


另外,我在@One2Many和@ManyOne之间进行双向导航时从经验中了解到了它们,为了防止N+1出现在列表中,我设置了@ManyTone(fetch=FetchType.LAZY),然后用@NamedEntityGraph覆盖repo接口中的相关findbyId(),当用@NamedEntityGraph检索时,嵌套项会被强制为渴望。这并不直接适用于这个问题,但确实证明了在spring数据rest中,对NSETD实体的检索是可控的

面对同样的问题,在我的例子中,由于大的结果集,子资源导致了GC错误,这就更加严重了。我认为我还应该重新暴露于虚假的资源,并在存储库中手动提供一个可分页的资源,通过ResourceProcessor.Related链接绑定-