iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么为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://www.lsjlt.com/news/306003.html(转载时请注明来源链接)

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么为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
  • ReactNative中添加自定义字体的方法
    目录添加字体定义 assets 目录执行 link 命令在样式中使用字体示例在 React Native 中,如何添加自定义字体呢?React Native 提供了便捷的命令行工具来...
    99+
    2022-11-13
    React Native自定义字体 React Native字体
  • 如何在jQuery中添加自定义方法
    随着前端技术的不断发展,越来越多的网站开始采用动态效果来丰富用户界面。jQuery是一种非常受欢迎的JavaScript库,它简化了对DOM、事件、AJAX等的操作,并提供了许多方便的方法和函数以快速创建动态效果。在此基础上,jQuery允...
    99+
    2023-05-14
  • C#为控件添加自定义事件及自定义触发
    先随便搞个事件吧 public class TestEventrgs : EventArgs { private string _name; ...
    99+
    2024-04-02
  • Spring Data JPA怎么自定义Repository接口
    本篇内容主要讲解“Spring Data JPA怎么自定义Repository接口”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Data J...
    99+
    2023-06-30
  • Hive中怎么添加自定义函数
    这篇文章主要讲解了“Hive中怎么添加自定义函数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Hive中怎么添加自定义函数”吧!环境介绍:CentOS7+hive-1.1.0-cdh6.7....
    99+
    2023-06-03
  • android为自定义CompoundButton添加涟漪效果
    要为自定义的CompoundButton添加涟漪效果,可以按照以下步骤进行:1. 创建一个新的drawable文件ripple_ef...
    99+
    2023-09-16
    android
  • SCWS中怎么添加自定义词典
    本篇文章为大家展示了SCWS中怎么添加自定义词典,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。require_once __DIR__.'/fun...
    99+
    2024-04-02
  • 继承jpa Repository 写自定义方法查询实例
    目录继承jpa Repository写自定义方法查询首先定义实体类项目报错提示信息为是什么原因呢?JpaRepository常用方法增改删查继承jpa Repository写自定义方...
    99+
    2024-04-02
  • javascript给元素添加自定义属性的方法
    小编给大家分享一下javascript给元素添加自定义属性的方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!javascript给元素添加自定义属性的方法:1、给元素添加自定义属性,代码为【obj.setAttribut...
    99+
    2023-06-14
  • 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
  • java怎么自定义数组添加数据
    在Java中,可以通过以下几种方式自定义数组添加数据:1. 使用循环逐个添加数据:通过使用循环,可以逐个向数组中添加数据。首先需要创...
    99+
    2023-09-26
    java
  • 怎么在Linux上添加自定义字体
    本篇内容主要讲解“怎么在Linux上添加自定义字体”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在Linux上添加自定义字体”吧!  觉得Linux系统默认字体不好看,想换个风格?想增加系统...
    99+
    2023-06-13
  • 为PHP运行时如何添加自定义扩展
    这篇文章将为大家详细讲解有关为PHP运行时如何添加自定义扩展,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。PHP 语言提供了一种扩展机制(Extension),通过 PHP 扩展可以增强语法、调用 C/C...
    99+
    2023-06-04
  • 如何为记账系统添加自定义插件功能 - 使用PHP开发自定义插件的方法
    随着业务的发展和需求的多样化,很多企业和个人都选择使用记账系统来管理财务和记账工作。然而,随着时间的推移,记账系统的功能可能无法完全满足用户的需求,这就需要我们为记账系统添加自定义插件功能,以实现个性化定制和功能扩展。本文将介绍如何使用PH...
    99+
    2023-10-21
    自定义插件 PHP开发 记账系统
  • CentOS 7怎么添加自定义系统服务
    小编给大家分享一下CentOS 7怎么添加自定义系统服务,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Centos7开机启动项分为system和user两种类型 ...
    99+
    2023-06-10
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作