12

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/またはで GET を呼び出すhttp://localhost:8080/users/と、ページングされた応答が生成されます。

GET を呼び出すとhttp://localhost:8080/users/1/changesets、すべての結果が 1 つの配列で取得され、ページングは​​発生しません。

親ユーザーを介してアクセスするときに、変更セットコレクションをページング可能な方法で返したいことを Spring Data Rest に示す方法はありますか? 変更セットのセットは急速に拡大するため、1 ページに大量の結果を返すのは避けたいと考えています。

編集:

Willie Wheeler が提案したように、これを ChangesetRepository に追加して検索可能にしました。

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

私は関係を双方向のままにしましたが、変更セットのセットで使用することにより、変更セットへのリンクをユーザーから隠すこともできました@RestResource(exported=false)

補足: 関係を export=false に設定すると、リンクが非表示になりますが、実際にはマッピングが削除されないようです。/users/1/changesets は宣伝されていませんが、有効です。

4

1 に答える 1

11

SDRがあなたが説明したアプローチを直接サポートしているとは思いません。

ただし、別のアプローチを取ることもできます。Personとの間の双方向の関係を使用する代わりに、からへのChangeset一方向にします。次に、次のようなメソッドを含めます。ChangesetPersonChangesetRepository

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

(あくまで記憶で書いているので、多少の調整は必要かもしれません。)

個人の変更セットは限られた数のコンテキストで関連していると私は想像するので、デザインの観点からは、とにかくこれは強いと思います。変更セットを人にまとめるよりも、変更セットを照会する方が適切な場合があります。

于 2014-01-30T23:41:51.147 に答える