返回顶部
首页 > 资讯 > 后端开发 > Python >如何为Repository添加自定义方法
  • 212
分享到

如何为Repository添加自定义方法

2024-04-02 19:04:59 212人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录为Repository添加自定义方法一、为某个Repository添加自定义方法二、添加全局Repository继承jpa Repository 写自定义方法查询首先定义实体类是

为Repository添加自定义方法

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

继承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,必须满足一些规则,规则如下

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

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

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

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

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

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

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

  • 如果我们想要使用jap框架,又不想再多增加一个自定义类,则必须符合其命名规则
  • 如果,你记不住jpa的规则也没关系,你可以自己再多写一个类来实现自定义查询方法

如下:

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


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

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


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

3. 实现UserRepositoryTwoService

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


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

自己在写自定义实现即可

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 如何为Repository添加自定义方法

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

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

猜你喜欢
  • 如何为Repository添加自定义方法
    目录为Repository添加自定义方法一、为某个Repository添加自定义方法二、添加全局Repository继承jpa Repository 写自定义方法查询首先定义实体类是...
    99+
    2024-04-02
  • 怎么为Repository添加自定义方法
    这篇文章主要介绍“怎么为Repository添加自定义方法”,在日常操作中,相信很多人在怎么为Repository添加自定义方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么为Repository添加自定...
    99+
    2023-06-25
  • 如何在jQuery中添加自定义方法
    随着前端技术的不断发展,越来越多的网站开始采用动态效果来丰富用户界面。jQuery是一种非常受欢迎的JavaScript库,它简化了对DOM、事件、AJAX等的操作,并提供了许多方便的方法和函数以快速创建动态效果。在此基础上,jQuery允...
    99+
    2023-05-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
  • 如何给MySQL添加自定义语法的方法示例
    目录1 背景2 新增关键词(token)3 新增语法4 类似于PT_partition添加对应的数据结构global_partition_clause1 背景 mysql语法解析器用的bison(即yacc)来实现的,而...
    99+
    2022-08-08
    MySQL自定义语法 MySQL自定义语法添加
  • 为PHP运行时如何添加自定义扩展
    这篇文章将为大家详细讲解有关为PHP运行时如何添加自定义扩展,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。PHP 语言提供了一种扩展机制(Extension),通过 PHP 扩展可以增强语法、调用 C/C...
    99+
    2023-06-04
  • jQuery中怎么添加自定义方法
    本文小编为大家详细介绍“jQuery中怎么添加自定义方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“jQuery中怎么添加自定义方法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、什么是jQuery自定义方...
    99+
    2023-07-06
  • Android Studio如何为Activity添加自定义注解信息
    普通Java-Kotlin类添加注释 添加类时注释作者信息和日期时间 依次打开 File—>Settings—>editor—>File and Code Tem...
    99+
    2024-04-02
  • 如何为Prometheus添加自定义告警通知渠道
    要为Prometheus添加自定义告警通知渠道,可以按照以下步骤操作: 创建一个新的告警接收器:首先,需要在Prometheus...
    99+
    2024-03-04
    Prometheus
  • 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
  • 如何为记账系统添加自定义插件功能 - 使用PHP开发自定义插件的方法
    随着业务的发展和需求的多样化,很多企业和个人都选择使用记账系统来管理财务和记账工作。然而,随着时间的推移,记账系统的功能可能无法完全满足用户的需求,这就需要我们为记账系统添加自定义插件功能,以实现个性化定制和功能扩展。本文将介绍如何使用PH...
    99+
    2023-10-21
    自定义插件 PHP开发 记账系统
  • PHP8中如何使用Attributes为类添加自定义注解?
    PHP8中如何使用Attributes为类添加自定义注解?自定义注解是一种在类或方法上添加元数据的方式,它可以帮助我们在运行时获取和处理特定的类或方法上的附加信息。在PHP8中,引入了Attributes的概念,它使我们可以轻松地为类添加自...
    99+
    2023-10-22
    PHP Attributes
  • android为自定义CompoundButton添加涟漪效果
    要为自定义的CompoundButton添加涟漪效果,可以按照以下步骤进行:1. 创建一个新的drawable文件ripple_ef...
    99+
    2023-09-16
    android
  • 继承jpa Repository 写自定义方法查询实例
    目录继承jpa Repository写自定义方法查询首先定义实体类项目报错提示信息为是什么原因呢?JpaRepository常用方法增改删查继承jpa Repository写自定义方...
    99+
    2024-04-02
  • C#怎么为控件添加自定义事件及自定义触发
    本文小编为大家详细介绍“C#怎么为控件添加自定义事件及自定义触发”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#怎么为控件添加自定义事件及自定义触发”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。先随便搞个事件...
    99+
    2023-06-30
  • springSecurity之如何添加自定义过滤器
    目录springSecurity 添加自定义过滤器很简单,配置如下然后再来看看myFilterspringSecurity 自定义认证过滤器出现的问题解决方法springSecuri...
    99+
    2024-04-02
  • 如何使用RequestHeaders添加自定义参数
    目录RequestHeaders添加自定义参数问题一原因解决方案修改request中header的值RequestHeaders添加自定义参数 在开发过程中有的时候,参数需要绑定到r...
    99+
    2024-04-02
  • WordPress如何添加自定义字段面板
    这篇文章主要介绍了WordPress如何添加自定义字段面板的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇WordPress如何添加自定义字段面板文章都会有所收获,下面我们一起来...
    99+
    2023-03-07
    wordpress
  • 如何向pyhanlp添加自定义的词典
    小编给大家分享一下如何向pyhanlp添加自定义的词典,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!以python 2.7.9为例:安装pyhanlp:pip i...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作