Spring Data Rest Страничная дочерняя коллекция

У меня есть @Entity под названием User. Он имеет набор наборов изменений следующим образом:

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

У меня есть пользовательский репозиторий:

@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, что я хочу вернуть коллекцию наборов изменений в виде страницы при доступе к ней через родительского пользователя? Набор наборов изменений будет быстро расти, и я бы не хотел возвращать тонны результатов на одной странице.

РЕДАКТИРОВАТЬ:

По предложению Вилли Уиллера я добавил это в свой ChangesetRepository, чтобы сделать его доступным для поиска:

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

Я оставил связь двунаправленной, но также смог скрыть ссылку на наборы изменений от пользователя, используя @RestResource(exported=false) в наборе наборов изменений.

Боковое примечание: кажется, что установка отношения exported=false скрывает ссылку, но фактически не удаляет сопоставление. /users/1/changesets не рекламируется, но все еще действует.


person Ethan Anderson    schedule 30.01.2014    source источник


Ответы (1)


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

Однако есть и другой подход. Вместо использования двунаправленной связи между Person и Changeset сделайте ее однонаправленной от Changeset к Person. Затем в вашем ChangesetRepository включите такой метод:

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

(Я просто делаю это по памяти, поэтому вам могут потребоваться небольшие корректировки.)

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

person Community    schedule 30.01.2014
comment
Это хорошее предложение. Я на самом деле реализовал это, и это довольно приятно. Я отредактирую свой пост с подробностями! - person Ethan Anderson; 31.01.2014
comment
Я приму ваш ответ. Просто хотел посмотреть, не прошел ли кто-нибудь еще какую-то конкретную настройку SDR, которая включила то, что я хотел. - person Ethan Anderson; 31.01.2014
comment
Следует использовать Page<Changeset> в качестве возвращаемого типа вместо List<Changeset> - person Tahir Akhtar; 13.04.2016
comment
У меня не сработало, не знаю почему, я добавил метод в репозиторий и перепробовал несколько комбинаций path и rel... - person Hatem Jaber; 21.03.2017
comment
@HatemJaber убедитесь, что вы используете дополнительный путь /search/. - person dardo; 11.10.2019