복붙노트

[SPRING] Spring 데이터 나머지 페이지 가능 자식 콜렉션

SPRING

Spring 데이터 나머지 페이지 가능 자식 콜렉션

나는 User라고 불리는 @Entity를 가지고있다. 그것은 다음과 같이 변경 집합을 가지고 있습니다 :

@OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL, mappedBy="user")
private Set<Changeset> changesets = new HashSet<Changeset>();

나는 UserRepository있다 :

@Repository
@RestResource(path = "users", rel = "users")
public interface UserRepository extends JpaRepository<User, Long>{ }

그리고 ChangesetRepository :

@Repository
@RestResource(path = "changesets", rel = "changesets")
public interface ChangesetRepository extends JpaRepository<Changeset, Long> { }

http : // localhost : 8080 / changesets / 또는 http : // localhost : 8080 / users /에서 GET을 호출하면 호출 응답이 생성됩니다.

http : // localhost : 8080 / users / 1 / changesets에서 GET을 호출하면 모든 결과가 단일 배열로 전달되고 페이징이 발생하지 않습니다.

Spring Data Rest에 부모 User를 통해 변경 집합 컬렉션을 페이지 형식으로 반환하려는 경우이를 나타낼 수 있습니까? 변경 집합은 빠르게 커질 것이며 단일 페이지에서 많은 결과를 반환하지 않을 것입니다.

편집하다:

윌리 휠러 (Willie Wheeler)가 제안한대로,이를 ChangesetRepository에 추가하여 검색 가능하게 만들었습니다.

@RestResource(path = "byUser", rel = "byUser")
public Page<Changeset> findByUser(@Param("id") User user, Pageable p);

관계를 양방향으로 유지하면서 변경 집합에 @RestResource (exported = false)를 사용하여 사용자의 변경 집합에 대한 링크를 숨길 수있었습니다.

사이드 노트 : 관계를 exported = false로 설정하면 링크가 숨겨 지지만 실제로 매핑이 제거되지는 않습니다. / users / 1 / changesets는 광고되지 않지만 여전히 유효합니다.

해결법

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

    1.SDR이 귀하가 묘사하는 접근 방식을 직접적으로 지원한다고 생각하지 않습니다.

    SDR이 귀하가 묘사하는 접근 방식을 직접적으로 지원한다고 생각하지 않습니다.

    당신이 취할 수있는 또 다른 접근 방법이 있습니다. Person과 Changeset 사이에 양방향 관계를 사용하는 대신 Changeset에서 Person으로 단방향으로 지정하십시오. 그런 다음 ChangesetRepository에서 다음과 같은 메소드를 포함하십시오.

    @RestResource(path = "find-by-person")
    Page<Changeset> findByPerson(@Param("person") Person person, Pageable pageable);
    

    (저는 메모리에서 그렇게하고 있습니다. 따라서 약간의 조정이 필요할 수 있습니다.)

    디자인 관점에서 나는 사람의 changesets가 제한된 수의 맥락에서 관련이 있다고 상상하기 때문에 이것이 더 강하다고 생각합니다. 변경 세트를 사람과 묶기보다는 쿼리하는 것이 더 적절할 수 있습니다.

  2. from https://stackoverflow.com/questions/21469538/spring-data-rest-pageable-child-collection by cc-by-sa and MIT license