我有一个@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/产生分页响应。
http://localhost:8080/changesets/
http://localhost:8080/users/
如果我调用GET,http://localhost:8080/users/1/changesets那么我将所有结果存储在一个数组中,并且不会发生分页。
http://localhost:8080/users/1/changesets
有没有办法向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)变更集集来向用户隐藏指向变更集的链接。
@RestResource(exported=false)
注意:似乎将关系设置为export = false会隐藏链接,但实际上并不会删除映射。/ users / 1 / changesets不会发布,但仍然有效。
我认为SDR不直接支持您描述的方法。
您可能会采取另一种方法。而不是使用之间的双向关系,Person并且Changeset,使其从单向的Changeset到Person。然后在您ChangesetRepository的方法中包含以下内容:
Person
Changeset
ChangesetRepository
@RestResource(path = "find-by-person") Page<Changeset> findByPerson(@Param("person") Person person, Pageable pageable);
(我只是从内存中这样做,因此您可能需要进行一些小的调整。)
从设计的角度来看,我认为这反而是更强的,因为我认为一个人的变更集在有限的上下文中是相关的。查询变更集可能比将其与人员捆绑在一起更为合适。