为Repository添加自定义方法

一、为某个Repository添加自定义方法

1、定义一个接口PersonDao,声明要添加的方法。

public interface PersonDao{
	public List<Person> getlist();
}

2、提供该接口的实现类PersonRepositoryImpl。类名需在要与声明的 Repository 后添加 Impl,并实现PersonDao中声明的方法。

@Repository
public class PersonRepositoryImpl implements PersonDao{

	@PersistenceContext
	private EntityManager em;
	
	@Override
	public List<Person> getlist() {
		Query query = em.createQuery("from Person");
		return query.getResultList();
	}
}

3、使用Repository 接口, 并继承PersonDao接口。

public interface PersonRepository 
	extends JpaRepository<Person, Integer>, JpaSpecificationExecutor<Person>, PersonDao{
		
}

4、这时SpringData会自动加载PersonRepositoryImpl的实现类。

@Test
public void testList(){
	List<Person> list = service.getList();
	for (Person p : list) {
		System.out.println(p);
	}
}

注意:XXXRepositoryImpl 与XXXRepository前面的名字必须相同,后面的也需要按照规则写,若将XXXRepositoryImpl与XXXRepository接口放在同意包下,XXXRepositoryImpl不需要添加@Repository注解,但是当XXXRepositoryImpl与XXXRepository接口不在同一包下,需要在在XXXRepositoryImpl类上加Repository注解进行修饰


二、添加全局Repository

1、声明一个接口, 在该接口中声明需要自定义的方法, 且该接口需要继承 Spring Data 的 Repository。

@NoRepositoryBean
public interface BaseRepository<T, ID extends Serializable> 
	extends JpaRepository<T, ID> {
	
	public void helloworld();
}

注意:全局的扩展实现类不要用 Imp 作为后缀名, 或为全局扩展接口添加 @NoRepositoryBean 注解告知 Spring Data: Spring Data 不把其作为 Repository

2、提供BaseRepository所声明的接口的实现类. 且继承 SimpleJpaRepository, 并提供方法的实现。

public class BaseRepositoryImpl<T, ID extends Serializable> 
	extends SimpleJpaRepository<T, ID>
	implements BaseRepository<T, ID> {

	private EntityManager em;

	public BaseRepositoryImpl(Class<T> domainClass, EntityManager em) {
		super(domainClass, em);
		this.em = em;
	}

	@Override
	public void helloworld() {
		System.out.println("helloworld");
	}
}

3、定义 JpaRepositoryFactoryBean 的实现类, 使其生成BaseRepository 定义的接口实现类的对象。

public class BaseRepositoryFactoryBean<R extends JpaRepository<T, I>, T, I extends Serializable>
		extends JpaRepositoryFactoryBean<R, T, I> {
	
	public BaseRepositoryFactoryBean(Class<? extends R> repositoryInterface) {
		super(repositoryInterface);
	}
	@Override
	protected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager) {
		return new MyRepositoryFactory(entityManager);
	}
	
	public static class MyRepositoryFactory<T, I extends Serializable>
		 extends JpaRepositoryFactory {
	
		private final EntityManager em;
		
		public MyRepositoryFactory(EntityManager entityManager) {
			super(entityManager);
			this.em = entityManager;
		}
		
		@Override
		protected Object getTargetRepository(RepositoryInformation information) {
			return new BaseRepositoryImpl<T, I>((Class<T>) information.getDomainType(), em);
		}
		
		@Override
		protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {
			return BaseRepositoryImpl.class;
		}
	}
}

4、修改 <jpa:repositories /> 节点的 factory-class 属性指向BaseRepositoryFactoryBean的全类名。

<jpa:repositories base-package="com.znsd.springdata.dao" 
		entity-manager-factory-ref="entityManagerFactory" 
		transaction-manager-ref="txManager" 
		factory-class="com.znsd.springdata.dao.BaseRepositoryFactoryBean" />

5、使用自定义的BaseRepository接口。

public interface StudentRepository extends BaseRepository<Student, Integer>{
	
}

猜你喜欢

转载自blog.csdn.net/peter824/article/details/82953992