Spring数据Rest中嵌套资源的java分页
当访问下面的URL时,我会得到相应的分页
/api/userPosts/
{
"_links" : {
"self" : {
"href" : "/api/userPosts{?page,size,sort}",
"templated" : true
},
"next" : {
"href" : api/userPosts?page=1&size=20{&sort}",
"templated" : true
}
},
"_embedded" : {
"userPosts" : [ {
...
然而,当访问下面的URL时,SpringDataREST并没有开箱即用的分页-
/api/users/4/userPosts
{
"_embedded" : {
"userPosts" : [ {
UserRepository和UserPostRepository都是带有分页的JPA存储库。结果,第二个URL抛出GC开销超出错误,因为返回结果的行数非常大
@RepositoryRestResource(excerptProjection = UserProjection.class)
public interface UserRepository extends BaseRepository<User, Integer>, UserRepositoryCustom {
}
public interface UserPostRepository extends BaseRepository<UserPost, Long> {
}
@NoRepositoryBean
public interface BaseRepository<T, N extends Serializable> extends JpaRepository<T, N>, QueryDslPredicateExecutor<T> {
}
有没有办法用第二个URL进行分页
# 1 楼答案
简短痛苦的回答:不,绝对不是
更痛苦的回答是:是的。通过重写大量Spring数据,JPA和Hibernate。 问题的核心是,当您请求嵌套实体(集合或非集合)时,嵌套实体不是来自存储库的查询。但它是从实体返回的。Spring Data/JPA中没有分页机制
Spring REST中的/api/users/4/userPosts请求基本上是这样做的:
所以检索用户。userPosts是对嵌套实体的即时或惰性引用,没有办法对其进行分页
实现这一目标的最简单也是唯一的解决方案是: 1.创建Spring数据搜索查询:UserPostRepository。findByUserId(长id,分页) 2.创建用于映射的定制Spring MVC控制器