返回顶部
首页 > 资讯 > 精选 >怎么为Repository添加自定义方法
  • 566
分享到

怎么为Repository添加自定义方法

2023-06-25 16:06:43 566人浏览 泡泡鱼
摘要

这篇文章主要介绍“怎么为Repository添加自定义方法”,在日常操作中,相信很多人在怎么为Repository添加自定义方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么为Repository添加自定

这篇文章主要介绍“怎么为Repository添加自定义方法”,在日常操作中,相信很多人在怎么为Repository添加自定义方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么为Repository添加自定义方法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

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

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

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

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

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

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

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

这时springData会自动加载PersonRepositoryImpl的实现类。

@Testpublic 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

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

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

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

提供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"); }}

定义 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;  } }}

修改 <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" />

使用自定义的BaseRepository接口。

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

继承jpa Repository 写自定义方法查询

今天在写jpa查询的时候,遇到了添加自定义方法,项目启动报错原因,现总结如下:

首先定义实体类

@Entity@Table(name = "user")Class User{     @Id    @GeneratedValue       int id;      @Column      String age;      @Column      String school;      @Column      String userName;  set,get方法 (省略)}
public interface UserRepository extends JpaRepository<User, Long> {      List<User> findByUsernameLike(String username);     List<User> aaa();}

启动项目时,项目报错提示信息为:org.springframework.data.mapping.PropertyReferenceException: No property aaa found for type com.fpi.safety.common.entity.po.User

再将List<User> aaa();方法去掉后,项目又可以正常启动运行

是什么原因呢?

经查找,原来是继承jpa,必须满足一些规则,规则如下

怎么为Repository添加自定义方法

怎么为Repository添加自定义方法

Spring Data JPA框架在进行方法名解析时,会先把方法名多余的前缀截取掉,比如find,findBy,read,readBy,get,getBy,然后对剩下的部分进行解析。

假如创建如下的查询:findByUserName(),框架在解析该方法时,首先剔除findBy,然后对剩下的属性进行解析,假设查询实体为User

先判断userName(根据POJO规范,首字母变为小写)是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,继续第二步;

从右往左截取第一个大写字母开头的字符串此处是Name),然后检查剩下的字符串是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设用户为查询实体的一个属性;

接着处理剩下部分(UserName),先判断用户所对应的类型是否有userName属性,如果有,则表示该方法最终是根据“User.userName”的取值进行查询;否则继续按照步骤2的规则从右往左截取,最终表示根据“User.userName”的值进行查询。

可能会存在一种特殊情况,比如User包含一个的属性,也有一个userNameChange属性,此时会存在混合。可以明确在属性之间加上“_”以显式表达意思,比如“findByUser_NameChange )“或者”findByUserName_Change()“

从上面,我们可以得知,jap在解析是,aaa在user类中是没有属性的,所以报错No property aaa found.

  • 如果我们想要使用jap框架,又不想再多增加一个自定义类,则必须符合其命名规则

  • 如果,你记不住jpa的规则也没关系,你可以自己再多写一个类来实现自定义查询方法

如下:

自定义一个接口,该接口用来声明自己额外定义的查询。

public interface UseerRepositoryTwo {    public List<User> searchUser(String name, int id);}

创建一个接口,该接口 extends JpaRepository 或者 CurdRepository, 以及上面自己定义的接口 UseerRepositoryTwo

public interface UserRepositoryTwoService extends CrudRepository<LogDTO, Integer>, CustomizedLogRepository {}

实现UserRepositoryTwoService

注意此处的类名,必须以 2 中创建的接口的名字UserRepositoryTwoService,后面加上 Impl 来声明,而不是写成 UseerRepositoryTwoImpl

public class UserRepositoryTwoServiceImpl implements UserRepositoryTwoService {    @Autowired    @PersistenceContext    private EntityManager entityManager;    @Override    public List<User> searchLogs(int Id, String name) {        ......    }}

到此,关于“怎么为Repository添加自定义方法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 怎么为Repository添加自定义方法

本文链接: https://lsjlt.com/news/306003.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么为Repository添加自定义方法
    这篇文章主要介绍“怎么为Repository添加自定义方法”,在日常操作中,相信很多人在怎么为Repository添加自定义方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么为Repository添加自定...
    99+
    2023-06-25
  • 如何为Repository添加自定义方法
    目录为Repository添加自定义方法一、为某个Repository添加自定义方法二、添加全局Repository继承jpa Repository 写自定义方法查询首先定义实体类是...
    99+
    2024-04-02
  • jQuery中怎么添加自定义方法
    本文小编为大家详细介绍“jQuery中怎么添加自定义方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“jQuery中怎么添加自定义方法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、什么是jQuery自定义方...
    99+
    2023-07-06
  • C#怎么为控件添加自定义事件及自定义触发
    本文小编为大家详细介绍“C#怎么为控件添加自定义事件及自定义触发”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#怎么为控件添加自定义事件及自定义触发”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。先随便搞个事件...
    99+
    2023-06-30
  • 如何在jQuery中添加自定义方法
    随着前端技术的不断发展,越来越多的网站开始采用动态效果来丰富用户界面。jQuery是一种非常受欢迎的JavaScript库,它简化了对DOM、事件、AJAX等的操作,并提供了许多方便的方法和函数以快速创建动态效果。在此基础上,jQuery允...
    99+
    2023-05-14
  • ReactNative中添加自定义字体的方法
    目录添加字体定义 assets 目录执行 link 命令在样式中使用字体示例在 React Native 中,如何添加自定义字体呢?React Native 提供了便捷的命令行工具来...
    99+
    2022-11-13
    React Native自定义字体 React Native字体
  • C#为控件添加自定义事件及自定义触发
    先随便搞个事件吧 public class TestEventrgs : EventArgs { private string _name; ...
    99+
    2024-04-02
  • win8.1怎么添加自定义磁贴?
    在METRO界面添加自定义快捷方式磁贴 1、创建需要磁贴的自定义快捷方式 2、进入METRO应用程序界面,右击一个“记事本”应用程序,点击“打开文件位置” ...
    99+
    2022-06-04
    自定义
  • Spring Data JPA怎么自定义Repository接口
    本篇内容主要讲解“Spring Data JPA怎么自定义Repository接口”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Data J...
    99+
    2023-06-30
  • android为自定义CompoundButton添加涟漪效果
    要为自定义的CompoundButton添加涟漪效果,可以按照以下步骤进行:1. 创建一个新的drawable文件ripple_ef...
    99+
    2023-09-16
    android
  • SCWS中怎么添加自定义词典
    本篇文章为大家展示了SCWS中怎么添加自定义词典,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。require_once __DIR__.'/fun...
    99+
    2024-04-02
  • Hive中怎么添加自定义函数
    这篇文章主要讲解了“Hive中怎么添加自定义函数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Hive中怎么添加自定义函数”吧!环境介绍:CentOS7+hive-1.1.0-cdh6.7....
    99+
    2023-06-03
  • 继承jpa Repository 写自定义方法查询实例
    目录继承jpa Repository写自定义方法查询首先定义实体类项目报错提示信息为是什么原因呢?JpaRepository常用方法增改删查继承jpa Repository写自定义方...
    99+
    2024-04-02
  • Spring Boot下如何自定义Repository中的DAO方法
     环境配置介绍jdk 1.8, spring Boot 1.5.3.RELEASE, MySQL, Spring Data, JPA问题描述Spring Data提供了一套简单易用的DAO层抽象与封装,覆盖的CURD的基本功能,但...
    99+
    2023-05-31
    spring boot repository
  • Spring Data JPA框架的Repository怎么自定义
    本文小编为大家详细介绍“Spring Data JPA框架的Repository怎么自定义”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring Data JPA框架的Repository怎么自...
    99+
    2023-06-30
  • CentOS7 systemd添加自定义系统服务的方法
    systemd: CentOS 7的服务systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和用户(user)之分,即:/usr/lib/systemd/system ,/usr/l...
    99+
    2022-06-04
    CentOS7 systemd 系统服务 CentOS7 添加自定义系统服务
  • javascript给元素添加自定义属性的方法
    小编给大家分享一下javascript给元素添加自定义属性的方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!javascript给元素添加自定义属性的方法:1、给元素添加自定义属性,代码为【obj.setAttribut...
    99+
    2023-06-14
  • java怎么自定义数组添加数据
    在Java中,可以通过以下几种方式自定义数组添加数据:1. 使用循环逐个添加数据:通过使用循环,可以逐个向数组中添加数据。首先需要创...
    99+
    2023-09-26
    java
  • 怎么在Linux上添加自定义字体
    本篇内容主要讲解“怎么在Linux上添加自定义字体”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在Linux上添加自定义字体”吧!  觉得Linux系统默认字体不好看,想换个风格?想增加系统...
    99+
    2023-06-13
  • 如何给MySQL添加自定义语法的方法示例
    目录1 背景2 新增关键词(token)3 新增语法4 类似于PT_partition添加对应的数据结构global_partition_clause1 背景 mysql语法解析器用的bison(即yacc)来实现的,而...
    99+
    2022-08-08
    MySQL自定义语法 MySQL自定义语法添加
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作