为Repository添加自定义方法
文章目录
- 一、为某个Repository添加自定义方法
- 1、定义一个接口PersonDao,声明要添加的方法。
- 2、提供该接口的实现类PersonRepositoryImpl。类名需在要与声明的 Repository 后添加 Impl,并实现PersonDao中声明的方法。
- 3、使用Repository 接口, 并继承PersonDao接口。
- 4、这时SpringData会自动加载PersonRepositoryImpl的实现类。
- 二、添加全局Repository
- 1、声明一个接口, 在该接口中声明需要自定义的方法, 且该接口需要继承 Spring Data 的 Repository。
- 2、提供BaseRepository所声明的接口的实现类. 且继承 SimpleJpaRepository, 并提供方法的实现。
- 3、定义 JpaRepositoryFactoryBean 的实现类, 使其生成BaseRepository 定义的接口实现类的对象。
- 4、修改 节点的 factory-class 属性指向BaseRepositoryFactoryBean的全类名。
- 5、使用自定义的BaseRepository接口。
一、为某个Repository添加自定义方法
1、定义一个接口PersonDao,声明要添加的方法。
public interface PersonDao{public List<Person> getlist();
}
2、提供该接口的实现类PersonRepositoryImpl。类名需在要与声明的 Repository 后添加 Impl,并实现PersonDao中声明的方法。
@Repository
public class PersonRepositoryImpl implements PersonDao{@PersistenceContextprivate EntityManager em;@Overridepublic 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;}@Overridepublic 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);}@Overrideprotected 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;}@Overrideprotected Object getTargetRepository(RepositoryInformation information) {return new BaseRepositoryImpl<T, I>((Class<T>) information.getDomainType(), em);}@Overrideprotected 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>{}
为Repository添加自定义方法相关推荐
- Spring Data Solr教程:向所有存储库添加自定义方法
如果我们在现实生活中的软件项目中使用Spring Data Solr,很可能我们迟早会遇到一个要求,该要求指出我们的应用程序必须能够与本地Solr服务器和SolrCloud进行通信 . 目前,满足此要 ...
- Active Perl的PPM的repository添加
参考:http://blog.sina.com.cn/s/blog_5538ddac0100as5v.html 添加repository后感觉下载速度有所加快!! ActivePerl PPM的安装包 ...
- 给数组添加自定义方法
假设我现在有这么一个需求,我需要给数组添加一个新的方法叫做toLower() Array.prototype.toLower=function(){for (i=0;i<this.length; ...
- python设计自定义函数_我可以为内置Python类型添加自定义方法/属性吗?
您无法直接将方法添加到原始类型.但是,您可以对类型进行子类化,然后将其替换为内置/全局命名空间,从而实现所需的大部分效果.不幸的是,由文字语法创建的对象将继续属于vanilla类型,并且不会有新的方法 ...
- vs2017开发ActiveX(主讲OCX)(十)、手动添加自定义方法
############################更新与2020-09-25######################### 目前使用的版本vs2019: 发现添加方法又正常了,所以下文说的添 ...
- ts给Number类型数据添加自定义方法报错:类型“Number”上不存在属性“divideStr”的解决方案
问题:直接添加方法报错. // 切割字符串或数字,将10000000转换成10,000,000的格式 String.prototype.divideStr = Number.prototype.div ...
- BaseRepository接口
BaseRepository接口 直接创建BaseRepository来继承JpaRepository接口 package cn.itsource.pss.repository; import cn. ...
- 智能商贸java代码实现——学习笔记day02
结构图 Pepository层 自定义一个Repository, 它是JpaRepository的功能基础上继承增强 自定义接口 如自定义接口 BaseRepository 继承JpaReposito ...
- Spring Data Solr教程:将自定义方法添加到单个存储库
我的Spring Data Solr教程的前一部分教我们如何使用查询方法创建静态查询. 自然而然的下一步将是描述如何使用Spring Data Solr创建动态查询. 但是,在继续讨论该主题之前,我们 ...
最新文章
- 谷歌发布深度学习新算法,适用于真实机器人的技能学习
- Python 技术篇-使用pygame库播放音乐没有声音问题解决办法
- [MIPS汇编语言]简单排序实现
- java aop 切面判断对象是否是一个类的实例
- [蓝桥杯][2013年第四届真题]危险系数-dfs+图的遍历
- XidianOJ 1123 K=1 Problem of Orz Pandas
- java基础语句_【Java基础-Java语言基础】
- 子程序调用编程序例子_汇编程序设计:LCD1602静态显示
- day14【前台】用户登录注册
- 十大笔记本电脑排行_2020双十一,十大高性价比游戏笔记本电脑值得买排行榜之搭载144Hz电竞屏机型(配置推荐)福利放送...
- 基于channel的goroutine
- 如何清除夏普AR-2408CN打印机屏出现小人小太阳
- BZOJ 2751: [HAOI2012]容易题(easy)( )
- 关于1KB病毒的清除
- RealityCapture摄影测量软件
- 高薪职业,英年早秃?关于程序员,多的是你不知道的事……
- webpack5从零搭建一个项目
- python登录qq定时发消息_python自动发送qq消息
- LAN8742 教程(1) 数据手册 中文翻译
- linux系统会流畅,号称流畅且最漂亮的Linux系统,成功让我放弃了windows 10!