基本方法
方法定义规则
|
符号 |
含义 |
|
And |
并且 |
|
Or |
或 |
|
Is,Equals |
等于 |
|
Between |
两者之间 |
|
LessThan |
小于 |
|
LessThanEqual |
小于等于 |
|
GreaterThan |
大于 |
|
GreaterThanEqual |
大于等于 |
|
After |
之后(时间)> |
|
Before |
之前(时间)< |
|
IsNull |
等于Null |
|
IsNotNull,NotNull |
不等于Null |
|
Like |
模糊查询。查询件中需要自己加% |
|
NotLike |
不在模糊范围内。查询件中需要自己加% |
|
StartingWith |
以某开头 |
|
EndingWith |
以某结束 |
|
Containing |
包含某 |
|
OrderBy |
排序 |
|
Not |
不等于 |
|
In |
某范围内 |
|
NotIn |
某范围外 |
|
TRUE |
真 |
|
FALSE |
假 |
|
IgnoreCase |
忽略大小写 |
解析原理
比如 findByUserAddressZip()。框架在解析该方法时,首先剔除findBy,然后对剩下的属性进行解析,详细规则如下(此处假设该方法针对的域对象为AccountInfo类型):
1. 先判断userAddressZip (根据 POJO 规范,首字母变为小写,下同)是否为AccountInfo 的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,继续第二步;
2. 从右往左截取第一个大写字母开头的字符串(此处为 Zip),然后检查剩下的字符串是否为AccountInfo的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设user 为AccountInfo 的一个属性;
3. 接着处理剩下部分(AddressZip ),先判断 user 所对应的类型是否有addressZip 属性,如果有,则表示该方法最终是根据 " AccountInfo.user.addressZip" 的取值进行查询;否则继续按照步骤 2 的规则从右往左截取,最终表示根据 " AccountInfo.user.address.zip" 的值进行查询。
可能会存在一种特殊情况,比如 AccountInfo包含一个 user 的属性,也有一个 userAddress 属性,此时会存在混淆。读者可以明确在属性之间加上 "_" 以显式表达意图,比如 "findByUser_AddressZip()" 或者"findByUserAddress_Zip()"。(强烈建议:无论是否存在混淆,都要在不同类层级之间加上"_" ,增加代码可读性)
官方文档
https://docs.spring.io/spring-data/jpa/docs/