编程语言
首页 > 编程语言> > java-Spring Data Rest中的分页用于嵌套资源

java-Spring Data Rest中的分页用于嵌套资源

作者:互联网

当访问下面的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时,Spring Data REST不会分页-

/api/users/4/userPosts

{
  "_embedded" : {
    "userPosts" : [ {

UserRepository和UserPostRepository都是具有分页功能的JPARepository.结果,第二个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进行分页吗?

解决方法:

简短而痛苦的回答:不.绝对不会.

长了更痛苦的答案:是的.通过重写Spring Data,JPA和Hibernate的大部分内容.
问题的核心是,当您请求嵌套实体(是否为集合)时,该嵌套实体不是从存储库查询的.但是是从实体返回的. Spring Data / JPA中没有用于分页的机制

Spring REST中的/ api / users / 4 / userPosts请求基本上是这样的:

User user = userRepository.findOne(4);
return user.userPosts;

因此,检索user.userPosts是对嵌套实体的Eager或Lazy引用,无法分页.

实现此目的的最简单且唯一的解决方案是:
 1.创建Spring Data搜索查询:UserPostRepository.findByUserId(Long id,Pagination pa)
 2.创建自定义的Spring MVC控制器进行映射

   @Get("/api/users/{id}/userPosts")
   public Page<UserPost> getUserPostsByUserId(Long id, Pagination pagi) {
     return userPostRepository.findByUserId(id, pagi);

>重要!你不能!将user.userPosts注释为嵌套在User实体中,否则请求映射将发生冲突.
>如果要在用户实体JSON中为此路径的导航超链接,则需要
用户实体JSON创建的自定义处理.它没有充分记录,并且所有示例都没有涉及您需要探索的确切用例.

标签:java,spring,spring-data-rest,spring-data
来源: https://codeday.me/bug/20191013/1906327.html