1

Spring Data Commons のドキュメントによると、カスタム メソッドの実装を Spring Data リポジトリに追加するのは非常に簡単です。

interface UserRepositoryCustom {
    public void someCustomMethod(User user);
}

class UserRepositoryCustomImpl implements UserRepositoryCustom {
    public void someCustomMethod(User user) {
        // Your custom implementation
    }
}

public interface UserRepository extends JpaRepository<User, Long>,
        UserRepositoryCustom {
}

しかし、私が理解できないのは、型引数を使用したい場合はどうなるでしょうか? 例えば:

interface SearchableRepository<T> {
    public Page<T> search(String query, Pageable page);
}

class SearchableRepositoryImpl<T> implements SearchableRepository<T> {
    public Page<T> search(String query, Pageable page) {
        // Right here, I need the Class<T> of T so that I can create
        // the JPA query
    }
}

public interface UserRepository extends JpaRepository<User, Long>,
        SearchableRepository<User> {
}

public interface NewsRepository extends JpaRepository<Article, Long>,
        SearchableRepository<Article> {
}

そのメソッドの実装では、JPA クエリを作成できるように、指定された型引数searchを知る必要があります。すべてのリポジトリを検索可能にしたくないため、すべてのリポジトリにカスタム動作を追加したくありません。インターフェイスを適用してリポジトリを選択したいだけです。Class<T>TSearchableRepository

では、どうすればこれを行うことができますか?それともできますか?

4

2 に答える 2

1

Class を SearchableRepositoryImpl に追加し、 NewsRepositoryImpl に挿入 (または作成) することができます。new SearchableRepositoryImpl(Article.class)

    class SearchableRepositoryImpl<T> implements SearchableRepository<T> {
      private Class<T> klass;
      public SearchableRepositoryImpl(Class<T> klazz){
        this.klass = klazz;
      }

      public Page<T> search(String query, Pageable page) {
            // Right here, I need the Class<T> of T so that I can create
            // the JPA query
        }
    }

    class NewsRepositoryImpl<Article> implements NewsRepository<Article> 
    {
      private SearchableRepository<Article> searchRepo = new SearchableRepositoryImpl(Article.class);
      public Page<T> search(String query, Pageable page){
        // delegate
        return searchRepo.search(query, page);
      }
}

たぶんnew SearchableRepositoryImpl、本当に春のベストプラクティスではありませんが、アイデアを示すためだけに

于 2013-08-07T18:15:48.813 に答える