2017-01-09 6 views
0

私は複数のエンティティからのデータを照会する「一般的な」リポジトリを作成したいです。私がそれをした場合:理解リポジトリ

@Repository 
public interface MyRepository { 

    @Query("select r from Role r") 
    List<Role> getRoles(); 

} 

MyRepositoryインスタンスが必要なときにSpringが実装する実装を見つけられないため、エラーが発生します。ここまでは順調ですね。今、私がこれを行う場合:

@Repository 
public interface MyRepository extends JpaRepository { 

    @Query("select r from Role r") 
    List<Role> getRoles(); 

} 

オブジェクトがJPA管理型(JpaRepositoryは一般的ではない)なので、私はエラーになります。さて、もう一度。私がこれをすると:

@Repository 
public interface MyRepository extends JpaRepository<User, String> { 

    @Query("select r from Role r") 
    List<Role> getRoles(); 

} 

それは動作します。どうして?私はロールではなくエンティティUserのJpaRepositoryを宣言しています。クエリーが別のクエリーに対抗する場合でもJpaRepositoryが具体的なエンティティを必要とするのはなぜですか?

+0

まただけこの場合、 'User'で、で動作する' findAll'、 'findOne'等のような他の方法を定義するので。 '@ Query'を使ってメソッドを指定したので、メソッドのシグネチャを調べます。 –

+0

は、私はちょうど@queryでクエリを実行したい場合でも、私はJpaRepositoryを拡張する必要がありますか? –

+2

なぜこのようなクエリが必要なのでしょうか? 'RoleRepository extends JpaRepository 'を作成し、 'findAll'メソッドを使用してください。しかし理論的には 'JpaRepository'ではなく' Repository'を拡張することができますが、なぜSpring Data JPAを使いたいのですか?あなたはすべての利点を失う。 –

答えて

1

春データのすべてのリポジトリがリポジトリのインターフェースを拡張する必要があり、それは一般的なインタフェースであるので、あなたは常にエンティティを指定する必要がありますが持つつもりの仕事であり、それがどのように春のデータであるので、あなたはそれについて何もできません実装されています。あなたは、リポジトリの作成について、ここでより多くの情報を見つけることができます。

http://docs.spring.io/spring-data/jpa/docs/1.4.0.M1/reference/html/repositories.html

一方、もちろん、あなたがリポジトリにあるエンティティを指定することができ、その後、あなたがすることができるので、あなたのインタフェース内のエンティティの他の型を返すメソッドを追加します必要なものを追加します(リポジトリインタフェースにはメソッドがありません)。しかし、親インタフェースのメソッドを使用する場合は、指定したエンティティを使用する必要があります。あなたの例では

、あなたは何@Mを行うことができます。 Deinumが提案され、はるかに理にかなってfindAllクエリを、JpaRepository<Role, Long>を作成して使用します。 JpaRepository<User, String>を使用しているのは、フレームワークの誤用です。

+0

私は30種類の異なる{Entity}リポジトリを持つことを避けようとしていました。単一のインタフェースでそれらのすべてを持つことは良いことです。 –

関連する問題