文章目录

  • 一、为某个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添加自定义方法相关推荐

  1. Spring Data Solr教程:向所有存储库添加自定义方法

    如果我们在现实生活中的软件项目中使用Spring Data Solr,很可能我们迟早会遇到一个要求,该要求指出我们的应用程序必须能够与本地Solr服务器和SolrCloud进行通信 . 目前,满足此要 ...

  2. Active Perl的PPM的repository添加

    参考:http://blog.sina.com.cn/s/blog_5538ddac0100as5v.html 添加repository后感觉下载速度有所加快!! ActivePerl PPM的安装包 ...

  3. 给数组添加自定义方法

    假设我现在有这么一个需求,我需要给数组添加一个新的方法叫做toLower() Array.prototype.toLower=function(){for (i=0;i<this.length; ...

  4. python设计自定义函数_我可以为内置Python类型添加自定义方法/属性吗?

    您无法直接将方法添加到原始类型.但是,您可以对类型进行子类化,然后将其替换为内置/全局命名空间,从而实现所需的大部分效果.不幸的是,由文字语法创建的对象将继续属于vanilla类型,并且不会有新的方法 ...

  5. vs2017开发ActiveX(主讲OCX)(十)、手动添加自定义方法

    ############################更新与2020-09-25######################### 目前使用的版本vs2019: 发现添加方法又正常了,所以下文说的添 ...

  6. ts给Number类型数据添加自定义方法报错:类型“Number”上不存在属性“divideStr”的解决方案

    问题:直接添加方法报错. // 切割字符串或数字,将10000000转换成10,000,000的格式 String.prototype.divideStr = Number.prototype.div ...

  7. BaseRepository接口

    BaseRepository接口 直接创建BaseRepository来继承JpaRepository接口 package cn.itsource.pss.repository; import cn. ...

  8. 智能商贸java代码实现——学习笔记day02

    结构图 Pepository层 自定义一个Repository, 它是JpaRepository的功能基础上继承增强 自定义接口 如自定义接口 BaseRepository 继承JpaReposito ...

  9. Spring Data Solr教程:将自定义方法添加到单个存储库

    我的Spring Data Solr教程的前一部分教我们如何使用查询方法创建静态查询. 自然而然的下一步将是描述如何使用Spring Data Solr创建动态查询. 但是,在继续讨论该主题之前,我们 ...

最新文章

  1. 谷歌发布深度学习新算法,适用于真实机器人的技能学习
  2. Python 技术篇-使用pygame库播放音乐没有声音问题解决办法
  3. [MIPS汇编语言]简单排序实现
  4. java aop 切面判断对象是否是一个类的实例
  5. [蓝桥杯][2013年第四届真题]危险系数-dfs+图的遍历
  6. XidianOJ 1123 K=1 Problem of Orz Pandas
  7. java基础语句_【Java基础-Java语言基础】
  8. 子程序调用编程序例子_汇编程序设计:LCD1602静态显示
  9. day14【前台】用户登录注册
  10. 十大笔记本电脑排行_2020双十一,十大高性价比游戏笔记本电脑值得买排行榜之搭载144Hz电竞屏机型(配置推荐)福利放送...
  11. 基于channel的goroutine
  12. 如何清除夏普AR-2408CN打印机屏出现小人小太阳
  13. BZOJ 2751: [HAOI2012]容易题(easy)( )
  14. 关于1KB病毒的清除
  15. RealityCapture摄影测量软件
  16. 高薪职业,英年早秃?关于程序员,多的是你不知道的事……
  17. webpack5从零搭建一个项目
  18. python登录qq定时发消息_python自动发送qq消息
  19. LAN8742 教程(1) 数据手册 中文翻译
  20. linux系统会流畅,号称流畅且最漂亮的Linux系统,成功让我放弃了windows 10!

热门文章

  1. 网游的跨服玩法是如何实现的?“跨域体系”架构设计思路
  2. 3---kaldi 自己录音,做自己版本的yesNo
  3. zabbix监控客户端时前端配置不成功
  4. 弹出表情气泡仿魔兽的技能冷效果却实现
  5. android控件——继承AdapterView的控件无法使用addView方法
  6. UNITY笔技--DOTS/ECS
  7. 学习随记三十一——递归实现二叉查找树
  8. trickle_ice 原理
  9. 基于matlab的DTMF信号的产生和检测(1)
  10. Oneday01 | ~scanf、冒泡排序、sort排序