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);
}
カスタム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 {
}
applicationContext.xmlでの構成の変更
entity-manager-factory-ref=“entityManagerFactory” factory-class=“cn.itsource.pss.repository.BaseRepositoryFactoryBean”/>
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); } }
直接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;
/**
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;
/**
@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); } }