一、为某个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>{
}