千家信息网

怎么为Repository添加自定义方法

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍"怎么为Repository添加自定义方法",在日常操作中,相信很多人在怎么为Repository添加自定义方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家
千家信息网最后更新 2026年11月03日怎么为Repository添加自定义方法

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

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

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

public interface PersonDao{ public List getlist();}

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

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

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

public interface PersonRepository  extends JpaRepository, JpaSpecificationExecutor, PersonDao{}

4、这时SpringData会自动加载PersonRepositoryImpl的实现类。

@Testpublic void testList(){ List 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。

@NoRepositoryBeanpublic interface BaseRepository  extends JpaRepository {  public void helloworld();}

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

2、提供BaseRepository所声明的接口的实现类. 且继承 SimpleJpaRepository, 并提供方法的实现。

public class BaseRepositoryImpl  extends SimpleJpaRepository implements BaseRepository { private EntityManager em; public BaseRepositoryImpl(Class domainClass, EntityManager em) {  super(domainClass, em);  this.em = em; } @Override public void helloworld() {  System.out.println("helloworld"); }}

3、定义 JpaRepositoryFactoryBean 的实现类, 使其生成BaseRepository 定义的接口实现类的对象。

public class BaseRepositoryFactoryBean, T, I extends Serializable>  extends JpaRepositoryFactoryBean {  public BaseRepositoryFactoryBean(Class repositoryInterface) {  super(repositoryInterface); } @Override protected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager) {  return new MyRepositoryFactory(entityManager); }  public static class MyRepositoryFactory   extends JpaRepositoryFactory {   private final EntityManager em;    public MyRepositoryFactory(EntityManager entityManager) {   super(entityManager);   this.em = entityManager;  }    @Override  protected Object getTargetRepository(RepositoryInformation information) {   return new BaseRepositoryImpl((Class) information.getDomainType(), em);  }    @Override  protected Class getRepositoryBaseClass(RepositoryMetadata metadata) {   return BaseRepositoryImpl.class;  } }}

4、修改 节点的 factory-class 属性指向BaseRepositoryFactoryBean的全类名。

5、使用自定义的BaseRepository接口。

public interface StudentRepository extends BaseRepository{}

继承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 {      List findByUsernameLike(String username);     List aaa();}

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

再将List 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 searchUser(String name, int id);}

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

public interface UserRepositoryTwoService extends CrudRepository, CustomizedLogRepository {}

3. 实现UserRepositoryTwoService

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

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

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

方法 接口 属性 查询 规则 实体 项目 学习 全局 框架 注解 类名 原因 名字 字母 字符 字符串 更多 用户 部分 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网是第几次科技革命的成果 互联网科技网 苏州找大状互联网科技有限公司 互联网科技活动banner 互联网未来科技 互联网与新科技 腾讯科技 互联网女皇 西安互联网科技公司 狮子座互联网科技培训 大白互联网科技 银川新华互联网科技学校地址 互联网科技博主是什么意思 团飞科技与伯堂互联网服务平台 互联网科技与管理 青岛科技大学互联网大赛研究生 新兴科技互联网创新大赛颁奖典礼 互联网科技大奖都有哪些公司 烟台灵鸽互联网科技有限公司 互联网科技手抄报图片 悟空问答互联网科技 金融科技 互联网金融 互联网科技公司电话 山东吉时兔互联网科技有限公司 创业天下互联网科技有限公司 全球顶尖互联网科技公司 互联网软件和科技 启辰互联网科技 长沙易易互联网科技有限公司 黑龙江互联网科技公司 东风日产互联网科技公司叫什么
0