mike-neckのブログ

Java or Groovy or Swift or Golang

Spring Rest Repositories + JPA で @ManyToOne で指定されているフィールドを用いて検索するリクエストを投げる

ドキュメント探しても、ググってもstack overflowを探しても明確に書かれていなかったっぽいので(本来的には hal の仕様を見るのが正しいかもしれない)

次のような二つのエンティティが存在するものとする。

@Entity
class Book {
  @Id
  private Integer id;
  private String title;
  // getter/setter 省略
}
class Review {
  @Id
  private Integer id;
  @ManyToOne(optional = false)
  private Book book;
  private String text;
  private LocalDateTime created;
  // getter/setter 省略
}

この Review クラスのレポジトリーを次のように作る

@Repository
interface ReviewRepository extends PagingAndSortingRepository<Review, Integer> {
  @RestResource(path = "by_book")
  Page<Review> findByBookOrderByCreatedDesc(@Param("book") final Book book, final Pageable pageable);
}

Spring Rest Repository で 関連するオブジェクトのレコードはオブジェクトそのものではなく、 link(URI) で表されるので、オブジェクトについても URI で指定できる。したがって Review リポジトリーを Book で検索する(上記findByBookOrderByCreatedDesc を呼び出す)ためのリクエストは次のようになる(アプリケーションはポート8080、コンテキストパスは book-repo とする)。

$ curl "http://localhost:8080/book-repo/reviews/search/by_book?book=http://localhost:8080/book-repo/books/2"