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

 更新时间:2021年12月9日 08:12  点击:384 作者:bird_tp

继承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) {
        ......
    }
}

自己在写自定义实现即可~

JpaRepository 命名规范

Keyword Sample JPQL
And findByLastnameAndFirstname where x.lastname=?1 and x.firstname=?2
Or findByLastnameOrFirstname where x.lastname=?1 or x.firstname=?2
Between findByStartDateBetween where x.startDate between ?1 and ?2
LessThan findByAgeLessThan where x.startDate < ?1
GreaterThan findByAgeGreaterThan where x.startDate >?1
After findByStartDateAfter where x.startDate >n ?1
Before findByStartDateBefore where x.startDate < ?1
IsNull findByAgeIsNull where x.age is null
IsNotNull,NotNull findByAge(Is)NotNull where x.age not null
Like findByFirstnameLike where x.firstname like ?1
notLike findByFirstnameNotLike where x.firstname not like ?1
StartingWith findByFirstnameStartingWithXXX where x.firstname like ?1(parameter bound with appended %)
EndingWith findByFirstnameEndingWithXXX where x.firstname like ?1(parameter bound with appended %)
Containing findByFirstnameContaining where x.firstname like ?1(parameter bound wrapped in %)
OrderBy findByAgeOrderByLastname where x.age = ?1 order by x.lastname desc
Not findByLastnameNot where x.lastname <> ?1
NotIn findByAgeNotIn(Collection age ) where x.age not in ?1
True findByActiveTrue() where x.active = true
False findByActiveFalse()

where x.active = false

例:

@RepositoryDefinition(domainClass = Employee.class, idClass = Integer.class)
public interface EmployeeRepository { //extends Repository<Employee,Integer>{
    public Employee findByName(String name);
    // where name like ?% and age <?
    public List<Employee> findByNameStartingWithAndAgeLessThan(String name, Integer age);
    // where name like %? and age <?
    public List<Employee> findByNameEndingWithAndAgeLessThan(String name, Integer age);
    // where name in (?,?....) or age <?
    public List<Employee> findByNameInOrAgeLessThan(List<String> names, Integer age);
    // where name in (?,?....) and age <?
    public List<Employee> findByNameInAndAgeLessThan(List<String> names, Integer age);
    @Query("select o from Employee o where id=(select max(id) from Employee t1)")
    public Employee getEmployeeByMaxId();
    @Query("select o from Employee o where o.name=?1 and o.age=?2")
    public List<Employee> queryParams1(String name, Integer age);
    @Query("select o from Employee o where o.name=:name and o.age=:age")
    public List<Employee> queryParams2(@Param("name")String name, @Param("age")Integer age);
    @Query("select o from Employee o where o.name like %?1%")
    public List<Employee> queryLike1(String name);
    @Query("select o from Employee o where o.name like %:name%")
    public List<Employee> queryLike2(@Param("name")String name);
    @Query(nativeQuery = true, value = "select count(1) from employee")//这个使用了原生sql
    public long getCount();
    @Modifying
    @Query("update Employee o set o.age = :age where o.id = :id")
    public void update(@Param("id")Integer id, @Param("age")Integer age);
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持猪先飞。

原文出处:https://blog.csdn.net/bird_tp/article/details/83651651

[!--infotagslink--]

相关文章

  • Spring Data JPA 关键字Exists的用法说明

    这篇文章主要介绍了Spring Data JPA 关键字Exists的用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-10
  • JPA如何使用nativequery多表关联查询返回自定义实体类

    这篇文章主要介绍了JPA如何使用nativequery多表关联查询返回自定义实体类,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-11-18
  • SpringData Repository接口用法解析

    这篇文章主要介绍了SpringData Repository接口用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-08-27
  • Spring JPA配置文件Eclipse报错如何解决

    这篇文章主要介绍了Spring JPA配置文件Eclipse报错如何解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-10-21
  • springdata jpa使用Example快速实现动态查询功能

    这篇文章主要介绍了springdata jpa使用Example快速实现动态查询功能,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-11-18
  • 解决Spring Data Jpa 实体类自动创建数据库表失败问题

    这篇文章主要介绍了解决Spring Data Jpa 实体类自动创建数据库表失败问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-12
  • SpringBoot2 Jpa 批量删除功能的实现

    这篇文章主要介绍了SpringBoot2 Jpa 批量删除功能的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-29
  • JPA使用乐观锁应对高并发方式

    这篇文章主要介绍了JPA使用乐观锁应对高并发方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-15
  • SpringCloud的JPA连接PostgreSql的教程

    这篇文章主要介绍了SpringCloud的JPA接入PostgreSql 教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-06-26
  • Springboot使用Spring Data JPA实现数据库操作

    Spring Data JPA 是 Spring 基于 Spring Data 框架、在JPA 规范的基础上开发的一个框架,使用 Spring Data JPA 可以极大地简化JPA 的写法,本章我们将详细介绍在Springboot中使用 Spring Data JPA 来实现对数据库的操作...2021-06-30
  • .NET Core实现分表分库、读写分离的通用 Repository功能

    这篇文章主要介绍了.NETCore 下支持分表分库、读写分离的通用 Repository,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • 解决JPA @OneToMany及懒加载无效的问题

    这篇文章主要介绍了解决JPA @OneToMany及懒加载无效的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-15
  • 继承JpaRepository后,找不到findOne()方法的解决

    这篇文章主要介绍了继承JpaRepository后,找不到findOne()方法的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-08-14
  • 解决Spring JPA 使用@transaction注解时产生CGLIB代理冲突问题

    这篇文章主要介绍了解决Spring JPA 使用@transaction注解时产生CGLIB代理冲突问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-08-05
  • Spring Boot JPA Repository之existsBy查询方法失效的解决

    这篇文章主要介绍了Spring Boot JPA Repository之existsBy查询方法失效的解决方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-10
  • MongoDB.Net工具库MongoRepository使用方法详解

    这篇文章主要为大家详细介绍了MongoDB.Net工具库MongoRepository的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
  • 聊聊Spring data jpa @query使用原生SQl,需要注意的坑

    这篇文章主要介绍了Spring data jpa@query使用原生SQl,需要注意的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-08-27
  • Spring Security+Spring Data Jpa如何进行安全管理

    这篇文章主要介绍了Spring Security+Spring Data Jpa如何进行安全管理,帮助大家更好的理解和学习Spring Security框架,感兴趣的朋友可以了解下...2020-09-03
  • SpringBoot2 JPA解决懒加载异常的问题

    这篇文章主要介绍了SpringBoot2 JPA解决懒加载异常的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-29
  • jpa介绍以及在spring boot中使用详解

    最近在项目中使用了一下jpa,发现还是挺好用的。这里就来讲一下jpa以及在spring boot中的使用。在这里我们先来了解一下jpa,希望能给你带来帮助...2021-08-11