BaseRepositoryインタフェース

6921 ワード

BaseRepositoryインタフェース
直接BaseRepositoryを作成してJpaRepositoryインタフェースを継承
package cn.itsource.pss.repository;
import cn.itsource.pss.query.BaseQuery; import org.springframework.data.domain.Page; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.repository.NoRepositoryBean;
import java.io.Serializable; import java.util.List;
/**
  • は、JpaRepositoryの機能に基づいて強化された
  • を継承するRepositoryをカスタマイズします.
  • @NoRepositoryBeanタグを追加すると、Spring Data Jpaは起動時にBaseRepositoryというインタフェース
  • をインスタンス化しません.
  • @param
  • @param */@NoRepositoryBean public interface BaseRepository extends JpaRepository,JpaSpecificationExecuter{//Queryからページングオブジェクト(ページング)Page findPageByQuery(BaseQuery baseQuery);//Queryから対応するすべてのデータ(ページングなし)List findByQuery(BaseQuery)//jpqlと対応するパラメータに基づいてデータList findByJpql(String jpql,Object...values);}

  • BaseRepositoryImpl機能実装
    カスタムメソッドを定義したら、まずBaseRepositoryクラスを追加し、SimpleJpaRepositoryクラスを継承してJpa Repositoryの基本メソッドを持つようにします.Repositoryには、2つのコンストラクション関数があることがわかりました.SimpleJpaRepository(J p a E n t i t y I n f o m a t i t y I n f o m a t i t y Information entityInformation,EntityManager)SimpleJpaRepository(Class domainClass,EntityManager em)ここでは、2番目のコンストラクション関数を実装し、domainClassとEntityManagerの2つのオブジェクトを取得します.
    package cn.itsource.pss.repository;
    import cn.itsource.pss.query.BaseQuery; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.repository.support.SimpleJpaRepository;
    import javax.persistence.EntityManager; import javax.persistence.Query; import java.io.Serializable; import java.util.List;
    /**
  • 親クラスの3つの方法
  • を実装する
  • @param
  • @param*/public class BaseRepositoriyImpl extends S i m p l e J p a Repository implements BaseRepository{private final Entity Manager entityManager;//親のこのコンストラクタpublic BaseRepositoryImpl(Class domainClass,Entity Manager em){super(domainClass,em);this.entityManager=em;@Override public Page findPageByQuery(BaseQuery baseQuery){//最初のステップ:すべての高度なクエリー条件Specification spec=baseQuery.createSpecification();//次のステップ:ソートされた値Sort sort=baseQuery.createSort();//3番目のステップ:条件に従ってページングデータを問合せ、Pageable pageable=new PageRequest(baseQuery.getJpage()に戻る, baseQuery.getPageSize(),sort); Page page = super.findAll(spec, pageable); return page; }

  • @Override public List findByQuery(BaseQuery baseQuery){//第一歩:すべての高度なクエリー条件Specification spec=baseQuery.createSpecification();//第二歩:ソートされた値Sort sort=baseQuery.createSort();//第三歩:データを取得してreturn findAll(spec,sort);
    @Override
    public List findByJpql(String jpql, Object... values) {
        //   :  Query  
        Query query = entityManager.createQuery(jpql);
        //   :     Query    
        if (values!=null) {
            for (int i = 0; i < values.length; i++) {
                query.setParameter(i + 1, values[i]);
            }
        }
        //   :    
        return query.getResultList();
    }
    

    }
    カスタムRepositoryFactoryBeanの作成
    次に、デフォルトのRepositoryFactoryBeanの代わりにカスタムRepositoryFactoryBeanを作成します.RepositoryFactoryBeanはRepositoryFactoryを返します.Spring Data JpaはRepositoryFactoryを使用してRepositoryの具体的なインプリメンテーションを作成します.ここではSimpleJpaRepositoryの代わりにBaseRepositoryをRepositoryインタフェースのインプリメンテーションとして使用します.これにより、すべてのRepositoryにカスタムメソッドを追加することができます.RepositoryFactoryを作成する方法を上書きする必要があります:createRepositoryFactory
    package cn.itsource.pss.repository;
    import org.springframework.data.jpa.repository.support.JpaRepositoryFactory; import org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean; import org.springframework.data.jpa.repository.support.SimpleJpaRepository; import org.springframework.data.repository.Repository; import org.springframework.data.repository.core.RepositoryInformation; import org.springframework.data.repository.core.RepositoryMetadata; import org.springframework.data.repository.core.support.RepositoryFactorySupport;
    import javax.persistence.EntityManager; import java.io.Serializable;
    public class BaseRepositoryFactoryBean, S, ID extends Serializable> extends JpaRepositoryFactoryBean {
    @Override
    protected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager) {
          return new MyRepositoryFactory(entityManager); // :            
    }
    
    //  JpaRepositoryFactory ,                
    private static  class MyRepositoryFactory   extends JpaRepositoryFactory{
        private final EntityManager entityManager;
        /**
         * Creates a new {@link JpaRepositoryFactory}.
         *
         * @param entityManager must not be {@literal null}
         */
        public MyRepositoryFactory(EntityManager entityManager) {
            super(entityManager);
            this.entityManager = entityManager;
        }
       //           
        @Override
        protected Object getTargetRepository(RepositoryInformation information) {
            return new BaseRepositoryImpl((Class)information.getDomainType(),entityManager);
        }
       //         
        @Override
        protected Class> getRepositoryBaseClass(RepositoryMetadata metadata) {
            return BaseRepositoryImpl.class;
        }
    }
    

    }
    applicationContext.xmlでの構成の変更
    entity-manager-factory-ref=“entityManagerFactory” factory-class=“cn.itsource.pss.repository.BaseRepositoryFactoryBean”/>
            BaseRepository
    

    public interface EmployeeRepository extends BaseRepository{ }
    拡張機能のテスト
    //テストページングクエリ@Test public void testFindPageByQuery(){EmployeeQuery=new EmployeeQuery();baseQuery.setUsername("1");///baseQueQuery.setAge(20);///baseQuery.setEmail("2");baseQueQuery.setEmail("2");baseQueQuery.setOrderByName("username"); baseQueQueQuery.setOrderByType("DESC");///basebaseeQueQueQueQueery.setOrderByType("DESC");//basebaseeQueQueQueQueQueQueQuey.setCurrentPage(2);baseQuery.setPageSize(5); Page page = employeeRepository.findPageByQuery(baseQuery); for (Employee employee : page) { System.out.println(employee); } }
    //@テスト個別クエリー@Test public void findByQuery(){EmployeeQuery baseQuery=new EmployeeQuery();baseQuery.setUsername("1");///baseQuery.setAge(20);///baseQuery.setEmail("2");baseQuery.setOrderByName("username");baseQuery.setOrderByType("DESC");List emps=employeeReeReyeeReyeeRee);baseseemps=employeeReyeeReeReyeeReeReyeeRee);义齿(Employee employee : emps) { System.out.println(employee); } }
    //カスタムJPQL@Test public void findByJpql(){List emps=employeeRepository.findByJpql(「select o from Employee o where username=?and password=?」“admin”,“admin”); for (Employee emp : emps) { System.out.println(emp); } }