有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    简短痛苦的回答:不,绝对不是

    更痛苦的回答是:是的。通过重写大量Spring数据,JPA和Hibernate。 问题的核心是,当您请求嵌套实体(集合或非集合)时,嵌套实体不是来自存储库的查询。但它是从实体返回的。Spring Data/JPA中没有分页机制

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

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

    所以检索用户。userPosts是对嵌套实体的即时或惰性引用,没有办法对其进行分页

    实现这一目标的最简单也是唯一的解决方案是: 1.创建Spring数据搜索查询:UserPostRepository。findByUserId(长id,分页) 2.创建用于映射的定制Spring MVC控制器

       @Get("/api/users/{id}/userPosts")
       public Page<UserPost> getUserPostsByUserId(Long id, Pagination pagi) {
         return userPostRepository.findByUserId(id, pagi);
    
    1. 重要!你不能!有用户。注释为嵌套在用户实体或请求映射中的用户帖子将发生冲突
    2. 如果你想在用户实体JSON中找到这个路径的导航超链接,那么你需要 用户实体JSON创建的自定义处理。它没有很好的文档记录,并且没有一个例子涵盖了这个您需要进一步探索的确切用例