2017-01-04 26 views
13

私はカスタムSpringリポジトリを実装しようとしています。私は春のブートを使用すると、応じていタイプのプロパティが見つかりません。カスタムSpringデータリポジトリ

public interface UserRepository extends JpaRepository<User, String>, FilterRepositoryCustom { 
... 
} 

public interface FilterRepositoryCustom { 
    List<User> filterBy(String role); 
} 

実装:

public class FilterRepositoryImpl implements FilterRepositoryCustom { 
... 
} 

と "メイン" リポジトリ、私のカスタムリポジトリを拡張私はインターフェイスを持っていますdocs

By default, Spring Boot will enable JPA repository support and look in the package (and its subpackages) where @SpringBootApplication is located.

私は自分のアプリケーションを実行すると、私はこのエラーを取得:

org.springframework.data.mapping.PropertyReferenceException: No property filterBy found for type User!

答えて

20

を参照してください。この作業を行うには、UserRepositoryImplを作成する必要があります。

Read this doc for more detail

基本的に

public interface UserRepositoryCustom { 
    List<User> filterBy(String role); 
} 

public class UserRepositoryImpl implements UserRepositoryCustom { 
... 
} 

public interface UserRepository extends JpaRepository<User, String>, UserRepositoryCustom { 
... 
} 
+2

私はこれが動作することに同意(およびアクションでそれを見ている)が、私は明示的に使用するリンクのドキュメント、とこの動作を両立に苦労しています ' UserRepository'という名前のリポジトリに「CustomizedUserRepositoryImpl'」を追加しました。次に、DocResositoryに 'HumanRepositoryImpl'と' ContactRepositoryImpl'を一緒に使用するようにドキュメントをさらに進めます(例29)。重要なことは、フラグメント実装名がベースリポジトリ名ではなくフラグメントインタフェース名と一致することを示しているようですが、それは明らかに私が見たものではありません。私は混乱しています... –

+3

基本的なリポジトリ名に基づいて実装名を指定するという要件は、旧式(1.x)のバージョンデータの場合にのみ当てはまります。スプリングデータのバージョン2.xでは、この要件が変更されます。 2.xでは、インプット名はカスタムインターフェイス名に従わなければなりません。 –

+0

あなたは私の時間を救い、私を幸せにしました!おかげさまで、Spring Dataの命名は本当にマザー、テストのためのイベントです。 –

0

これは、JPAのエラーですが、あなたのエンティティが「filterBy」プロパティを持っていないことを意味します。あなたのメソッドはfindByRole(String role)のようなものを呼び出す必要があります。ここで、 "role"はプロパティです。

は、ここでの問題は、あなたがFilterRepositoryImplを作成しているが、あなたはUserRepositoryでそれを使用していることであるhttps://docs.spring.io/spring-data/jpa/docs/current/reference/html/

関連する問題