上篇文章介绍了 “使用jpa的 Repository 自定义声明式查询方法” (declare query method)
使用jpa的 Repository 自定义声明式查询方法
凡是继承了Repository的或继承其子接口的,都可以使用自定义的声明式查询方法,如下示例:
public interface PersonQueryRepo extends Repository { // declare query method // 声明式查询方法 // 1. count 计数 long countByName(String name); // 2. get/find/stream/query/read 查询 Person readFirstByAge(int age); // 3. delete/remove 删除 int deleteById(long id); }
声明式查询方法可以分3大类:
1 计数类 :以count开头,返回数值类型

2 查询类:以get/find/stream/query/read开头,返回Person类或其集合

3 删除类: 以delete/remove开始,返回int类型

在以上方法之后还有可以加入下面的关键词:
jpa声明式查询方法名称关键词
其中声明式查询方法的方法名称支持的关键字 如下:
Keyword | Sample | JPQL snippet |
---|---|---|
And | findByLastnameAndFirstname | … where x.lastname = ?1 and x.firstname = ?2 |
Or | findByLastnameOrFirstname | … where x.lastname = ?1 or x.firstname = ?2 |
Is, Equals | findByFirstname ,findByFirstnameIs ,findByFirstnameEquals | … where x.firstname = ?1 |
Between | findByStartDateBetween | … where x.startDate between ?1 and ?2 |
LessThan | findByAgeLessThan | … where x.age < ?1 |
LessThanEqual | findByAgeLessThanEqual | … where x.age <= ?1 |
GreaterThan | findByAgeGreaterThan | … where x.age > ?1 |
GreaterThanEqual | findByAgeGreaterThanEqual | … where x.age >= ?1 |
After | findByStartDateAfter | … where x.startDate > ?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 | findByFirstnameStartingWith | … where x.firstname like ?1 (parameter bound with appended % ) |
EndingWith | findByFirstnameEndingWith | … where x.firstname like ?1 (parameter bound with prepended % ) |
Containing | findByFirstnameContaining | … where x.firstname like ?1 (parameter bound wrapped in % ) |
OrderBy | findByAgeOrderByLastnameDesc | … where x.age = ?1 order by x.lastname desc |
Not | findByLastnameNot | … where x.lastname <> ?1 |
In | findByAgeIn(Collection<Age> ages) | … where x.age in ?1 |
NotIn | findByAgeNotIn(Collection<Age> ages) | … where x.age not in ?1 |
True | findByActiveTrue() | … where x.active = true |
False | findByActiveFalse() | … where x.active = false |
IgnoreCase | findByFirstnameIgnoreCase | … where UPPER(x.firstame) = UPPER(?1) |
因此,jpa中使用以上三类操作,加上上表中的关键词作为约束条件,就可以极限大部分的查询和日常操作。
此外,对于jpa中更新的update操作,推荐使用@Query注解,详见http://jvm123.com/2019/09/springboot-jpa.html 。