Spring Data Rest Pageable Child Collection

时间:2014-01-30 23:19:53

标签: spring hibernate spring-data spring-data-jpa spring-data-rest

我有一个名为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表明我想在通过其父用户访问时以可分页的方式返回changesets集合?变更集集将快速增长,我宁愿不在单个页面中返回大量结果。

编辑:

根据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 个答案:

答案 0 :(得分:10)

我认为SDR不直接支持您描述的方法。

你可能会采取另一种方法。不是在PersonChangeset之间使用双向关系,而是从ChangesetPerson使其成为单向关系。然后在ChangesetRepository中添加如下方法:

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

(我只是从记忆中做到这一点,所以你可能需要进行微调。)

从设计的角度来看,我认为无论如何这都是更强大的,因为我认为一个人的变化集在有限的背景下是相关的。查询变更集可能更合适,而不是将其与人员捆绑在一起。