2017-06-26 6 views
0

リポジトリレイヤでカスタム動的検索を行う必要があります。クエリメソッドまたはクエリアノテーションを使用してクエリを実行することはできません。 この動的検索は、私がアプリケーションを実行すると、私はcom.dwengo.cards.repositoryにコンストラクタのfindAllの指定方法にアクセスできるカスタムリポジトリ

パラメータ0を得るpleJpaRepositoryバネクラスによって実装されているのfindAll(仕様、ページング)

public interface CardsRepositoryCustom { 
    public Page<Cards> customSearch(CardSearch CardSearch, Pageable page); 
} 

public interface CardsRepository extends JpaRepository<Cards, Integer>, CardsRepositoryCustom { 

} 

@Repository 
public class CardsRepositoryImpl extends SimpleJpaRepository implements CardsRepositoryCustom{ 

    public CardsRepositoryImpl(Class<Cards> domainClass, EntityManager em) { 
     super(domainClass, em); 
    } 

    @PersistenceContext 
    private EntityManager em; 

    @Override 
    public Page<Cards> customSearch(CardSearch CardSearch, Pageable page) { 
     Specification<Cards> specification = (Root<Cards> root, CriteriaQuery<?> cq, CriteriaBuilder cb) -> { 
      .. 
     } 
     return this.findAll(specification, page); 
    } 
} 


@Service 
public class CardsServiceImpl implements CardsService { 

    @Autowired 
    public CardsServiceImpl(CardsRepository CardsRepository) { 
     this.CardsRepository = CardsRepository; 
    } 

    public CardsRepository CardsRepository; 

    @Override 
    public Page<Cards> customSearch(CardSearch CardSearch, Pageable page) { 
     ... 
     return CardsRepository.customSearch(CardSearch, page); 
    } 
    ... 

} 

を呼び出す必要があります。 CardsRepositoryImplが必要です

+0

をCardsRepositoryImplコンストラクタの最初のパラメータは無用です。 superを呼び出すときは、Cards.classを直接使用してください。 – JEY

+0

変更なしcom.dwengo.cards.repository.CardsRepositoryImplのコンストラクタのパラメータ0は、見つからなかったjava.lang.Class型のBeanを必要としました。 –

+0

だからあなたは定義からそれを削除していません...そしてあなたはコンストラクタにautowiredを設定する必要があります。 (JpaEntityInformation entityInformation、EntityManagerのはEntityManager)または@Autowired 公共CardsRepositoryImpl(クラスdomainClass、のEntityManager EM){ スーパー(カード付き(クラス domainClass、のEntityManager EM):私たちはSimpleJpaRepositoryクラスを拡張するとき – JEY

答えて

3

SpringはそのBean CardsRepositoryImplを構築する必要がありますが、@Autowiredまたは@Injectはコンストラクタで定義されていません。だから、春はデフォルトの(引数なしの)コンストラクタを使ってインスタンスを作成しようとします。これは2つのパラメータが必要で、最初のもの(インデックス0)がClass型であるため失敗します。

@Autowiredをコンストラクタに追加すると、スプリングが依存関係を解決しようとします。クラスのBeanが見つかりません。完全に理解できる。さらに、Classパラメータは無用です。

をして、あなたの定義を変更し

:クラス のみCards.classで入手することができますので、

public class CardsRepositoryImpl extends SimpleJpaRepository<Cards, Long> implements CardsRepository { 
    private final EntityManager em; 
    @Autowired 
    public CardsRepositoryImpl(EntityManager em) { 
     super(Cards.class, em); 
    } 

    @Override 
    public Page<Cards> customSearch(CardSearch CardSearch, Pageable page) { 
     Specification<Cards> specification = (Root<Cards> root, CriteriaQuery<?> cq, CriteriaBuilder cb) -> { 
     .. 
     } 
     return this.findAll(specification, page); 
    } 
} 
+0

はうまく動作していますが、すでにコンストラクタにautowiredを入れようとしましたが、最初のパラメータを削除することは考えていませんでした。 –

関連する問題