복붙노트

[SPRING] 중첩 된 리소스에 대한 스프링 데이터 나머지의 페이지 매김

SPRING

중첩 된 리소스에 대한 스프링 데이터 나머지의 페이지 매김

아래 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을 사용하여 페이지 매김을 수행하는 방법은 무엇입니까?

해결법

  1. ==============================

    1.짧은 고통스러운 대답 : 아니. 당연하지.

    짧은 고통스러운 대답 : 아니. 당연하지.

    길고 고통스러운 답변 : 예. Spring Data, JPA, Hibernate의 큰 섹션을 다시 작성함으로써. 문제의 핵심은 중첩 된 엔터티 (컬렉션이든 아니든)를 요청할 때 중첩 된 엔터티가 리포지토리의 쿼리가 아니라는 것입니다. 그러나 is는 엔티티에서 반환됩니다. 페이징을위한 Spring Data / JPA에는 아무런 메커니즘이 없다.

    Spring REST에서 what / api / users / 4 / user Post 요청은 기본적으로 다음과 같습니다.

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

    따라서 user.userPosts를 검색하는 것은 중첩 된 엔티티에 대한 Eager 또는 Lazy 참조이며이를 호출 할 방법이 없습니다.

    이를 달성하는 가장 쉽고 유일한 해결책은 다음과 같습니다.  1. Spring 데이터 검색 쿼리 생성 : UserPostRepository.findByUserId (Long ID, Pagination pa)  2. 맵핑을위한 커스텀 스프링 MVC 컨트롤러를 만든다.

       @Get("/api/users/{id}/userPosts")
       public Page<UserPost> getUserPostsByUserId(Long id, Pagination pagi) {
         return userPostRepository.findByUserId(id, pagi);
    
  2. from https://stackoverflow.com/questions/26451920/pagination-in-spring-data-rest-for-nested-resources by cc-by-sa and MIT license