Spring Data JPA、カスタムリポジトリ


Spring Data JPAのRepository
Spring Data JPAでは、レポートはインタフェースのみを定義し、インプリメンテーションボディはスプリングによって自動的に生成されます.
Spring Data JPAが提供するインタフェースを直接実装したい場合は、実装する機能が多すぎて、かえって効率が低下します.
では、様々な理由でインタフェースメソッドを直接実装したい場合は、どうすればいいのでしょうか.
代表的な方法は以下の通りです.
  • JPAダイレクトインプリメンテーション(EntityManager)
  • を使用
  • Spring JDBCテンプレート
  • を使用
  • Mybatis
  • を使用
  • データベースインタフェースを直接使用...等
  • QueryDSLを使用します.
  • 直接使用JPA実施
    これはJPAを用いて直接実現する方法である.
    カスタムインタフェース
    public interface MemberRepositoryCustom {
    	List<Member> findMemberCustom();
    }
    カスタムインタフェース実装クラス
    @RequiredArgsConstructor
    // MemberRepository(리포지토리 인터페이스 이름) + Impl
    public class MemberRepositoryImpl implements MemberRepositoryCustom {
        
        private final EntityManager em;
        
        @Override
        public List<Member> findMemberCustom() {
            return em.createQuery("select m from Member m")
                    .getResultList();
        }
    }
    カスタムインタフェースの継承
    public interface MemberRepository
            extends JpaRepository<Member, Long>, MemberRepositoryCustom {
    }
    カスタムメソッドの呼び出し
    以下のように使用します.
    List<Member> result = memberRepository.findMemberCustom();
    リファレンス
    カスタムインプリメンテーションクラスの名前には、「リポジトリインタフェース名+Impl」というルールがあります.
    これによりSpring Data JPAはSpring Beanとして認識して登録して管理することができます.
    Implの代わりに別の名前を使用する場合は、次の2つの方法のいずれかを使用します.
  • XML設定
  • <repositories base-package="study.datajpa.repository"
                    repository-impl-postfix="Impl" />
  • Java Config設定
  • @EnableJpaRepositories(basePackages = "study.datajpa.repository",
                               repositoryImplementationPostfix = "Impl")
    Spring Data 2.xから実装クラスは「リポジトリインタフェース名+Impl」に置き換えられます.
    「カスタムインタフェース名+Impl」方式もサポートされています.
    つまり、MemberRepositoryCustomImplではなく、MemberRepositoryCustomImplのようにすることができます.
    @RequiredArgsConstructor
    // MemberRepositoryCustom(사용자 정의 인터페이스 명) + Impl
    public class MemberRepositoryCustomImpl implements MemberRepositoryCustom {
        
        private final EntityManager em;
            
        @Override
        public List<Member> findMemberCustom() {
            return em.createQuery("select m from Member m")
                    .getResultList();
        } 
    }
    実際の作業では、通常、QueryDSLまたはSpringJdbcTemplateを使用するときにカスタムライブラリ機能が使用されます.