为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>{
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

peter824

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值