9

У меня есть @Entity, называемый User. Он имеет набор ревизиями следующим образом:Spring Data Rest Pageable Child Collection

@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> { } 

Вызов GET на http://localhost:8080/changesets/ или http://localhost:8080/users/ дает страничный ответ.

Если я позвоню GET на http://localhost:8080/users/1/changesets, тогда я получаю все результаты в одном массиве, и пейджинг не возникает.

Есть ли способ указать Spring Data Rest, что я хочу вернуть коллекцию наборов изменений в виде страницы при доступе к ней через своего родительского пользователя? Набор изменений будет быстро расти, и я бы предпочел не возвращать тонны результатов на одной странице.

EDIT:

Как предложил Вилли 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 не объявляется, но он по-прежнему действителен.

ответ

8

Я не думаю, что SDR напрямую поддерживает описанный вами подход.

Существует еще один подход, который вы могли бы предпринять. Вместо использования двунаправленного отношения между Person и Changeset, сделайте его однонаправленным от Changeset до Person. Затем в ChangesetRepository включают в себя метод, как это: (. Я просто делаю, что из памяти, так что вы можете потребовать незначительные корректировки)

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

С точки зрения дизайна, я думаю, что это сильнее в любом случае, так как я полагаю, что набор изменений человека имеет значение в ограниченном числе контекстов. Возможно, более целесообразно запрашивать изменения, а не связывать их с человеком.

+0

Это хорошее предложение. Я действительно реализовал его, и это довольно хорошо. Я отредактирую свой пост с подробностями! –

+0

Я приму свой ответ. Просто хотелось посмотреть, не попал ли кто-нибудь еще с определенной настройкой SDR, которая позволяла мне то, что я хотел. –

+0

Должен использовать 'Page ' как возвращаемый тип вместо 'List ' –

Смежные вопросы