继承jpa Repository 写自定义方法查询实例
继承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
相关文章
Spring Data JPA 关键字Exists的用法说明
这篇文章主要介绍了Spring Data JPA 关键字Exists的用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-10JPA如何使用nativequery多表关联查询返回自定义实体类
这篇文章主要介绍了JPA如何使用nativequery多表关联查询返回自定义实体类,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-11-18- 这篇文章主要介绍了SpringData Repository接口用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-08-27
- 这篇文章主要介绍了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 批量删除功能的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-29
- 这篇文章主要介绍了JPA使用乐观锁应对高并发方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-15
SpringCloud的JPA连接PostgreSql的教程
这篇文章主要介绍了SpringCloud的JPA接入PostgreSql 教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-06-26Springboot使用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及懒加载无效的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-15
继承JpaRepository后,找不到findOne()方法的解决
这篇文章主要介绍了继承JpaRepository后,找不到findOne()方法的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-08-14解决Spring JPA 使用@transaction注解时产生CGLIB代理冲突问题
这篇文章主要介绍了解决Spring JPA 使用@transaction注解时产生CGLIB代理冲突问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-08-05Spring Boot JPA Repository之existsBy查询方法失效的解决
这篇文章主要介绍了Spring Boot JPA Repository之existsBy查询方法失效的解决方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-10MongoDB.Net工具库MongoRepository使用方法详解
这篇文章主要为大家详细介绍了MongoDB.Net工具库MongoRepository的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22聊聊Spring data jpa @query使用原生SQl,需要注意的坑
这篇文章主要介绍了Spring data jpa@query使用原生SQl,需要注意的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-08-27Spring Security+Spring Data Jpa如何进行安全管理
这篇文章主要介绍了Spring Security+Spring Data Jpa如何进行安全管理,帮助大家更好的理解和学习Spring Security框架,感兴趣的朋友可以了解下...2020-09-03- 这篇文章主要介绍了SpringBoot2 JPA解决懒加载异常的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-29
- 最近在项目中使用了一下jpa,发现还是挺好用的。这里就来讲一下jpa以及在spring boot中的使用。在这里我们先来了解一下jpa,希望能给你带来帮助...2021-08-11