<>jpa方法名命名规则

<>一、常用规则速查

No.关键词描述示例同功能JPQL
1And并且findByLastnameAndFirstnamewhere x.lastname = ?1 and x.firstname = ?2
2Or或findByLastnameOrFirstnamewhere x.lastname = ?1 or x.firstname = ?2
3Is,Equals等于findByFirstname,findByFirstnameIs,findByFrstnameEqualswhere
x.firstname = ?1
4Between两者之间findByStartDateBetweenwhere x.startDate between ?1 and ?2
5LessThan小于findByAgeLessThanwhere x.age < ?1
6LessThanEqual小于等于findByAgeLessThanEqualwhere xage <= ?1
7GreaterThan大于findByAgeGreaterThanwhere x.age > ?1
8GreaterThanEqual大于等于findByAgeGreaterThanEqualwhere x.age >= ?1
9After之后(时间)findByStartDateAfterwhere x.startDate > ?1
10Before之前(时间)findByStartDateBeforewhere x.starDate < ?1
11IsNull等于NullfindByAgeIsNullwhere x.age is null
12IsNotNull,NotNull不等于NullfindByAge(Is)NotNullwhere x.age is not null
13Like模糊查询。查询件中需要自己加 %findByFirstnameLikewhere x.firstname like ?1
14NotLike不在模糊范围内。查询件中需要自己加 %findByFirstnameNotLikewhere x.firstname not like ?1
15StartingWith以某开头findByFirstnameStartingWithwhere x.firstname like ?1(参数后加%)
16EndingWith以某结束findByFirstnameEndingWithwhere x.firstname like ?1(参数前加%)
17Containing包含某findByFirstnameContainingwhere x.firstname like ?1(参数前后加%)
18OrderBy排序findByAgeOrderByLastnameDescwhere x.age = ?1 order by x.lastname
desc
19Not不等于findByLastnameNotwhere x.lastname <> ?1
20In某范围内findByAgeIn(Collection ages)where x.age in ?1
21NotIn某范围外findByAgeNotIn(Collection age)where x.age not in ?1
22True真findByActiveTrue()where x.active = true
23False假findByActiveFalse()where x.active = false
24IgnoreCase忽略大小写findByFirstnameIgnoreCasewhere UPPER(x.firstame) = UPPER(?1)

<>二、Spring Data 解析方法名–规则说明

<>1、规则描述

按照Spring data 定义的规则,查询方法以find|read|get开头(比如
find、findBy、read、readBy、get、getBy),涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性首字母需大写。框架在进行方法名解析时,会先把方法名多余的前缀截取掉,然后对剩下部分进行解析。

如果方法的最后一个参数是 Sort 或者 Pageable 类型,也会提取相关的信息,以便按规则进行排序或者分页查询。

<>2、举例说明

比如 findByUserAddressZip()。框架在解析该方法时,首先剔除
findBy,然后对剩下的属性进行解析,详细规则如下(此处假设该方法针对的域对象为 AccountInfo 类型):

先判断 userAddressZip (根据 POJO 规范,首字母变为小写,下同)是否为 AccountInfo
的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,继续第二步;

从右往左截取第一个大写字母开头的字符串(此处为 Zip),然后检查剩下的字符串是否为 AccountInfo
的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设 user 为 AccountInfo 的一个属性;

接着处理剩下部分( AddressZip ),先判断 user 所对应的类型是否有 addressZip 属性,如果有,则表示该方法最终是根据
“AccountInfo.user.addressZip” 的取值进行查询;否则继续按照步骤 2 的规则从右往左截取,最终表示根据
“AccountInfo.user.address.zip” 的值进行查询。

可能会存在一种特殊情况,比如 AccountInfo 包含一个 user 的属性,也有一个 userAddress
属性,此时会存在混淆。读者可以明确在属性之间加上 “" 以显式表达意图,比如 “findByUser_AddressZip()” 或者
“findByUserAddress_Zip()”。(强烈建议:无论是否存在混淆,都要在不同类层级之间加上"” ,增加代码可读性)

<>三、一些情况

<>1、当查询条件为null时。

举例说明如下:

实体定义:对于一个客户实体Cus,包含有name和sex,均是String类型。

查询方法定义:List findByNameAndSex(String name,String sex);

使用时:dao.findByNameAndSex(null, “男”);

后台生成sql片断:where (cus0_.name is null) and cus0_.sex=?

结论:当查询时传值是null时,数据库中只有该字段是null的记录才符合条件,并不是说忽略这个条件。也就是说,这种查询方式,只适合于明确查询条件必须传的业务,对于动态查询(条件多少是动态的,例如一般的查询列表,由最终用户使用时决定输入那些查询条件),这种简单查询是不能满足要求的。

<>2、排序

?
1.List findBySexOrderByName(String sex); //名称正序(正序时,推荐此方式,简单)
2.List findBySexOrderByNameAsc(String sex); //名称正序(效果同上)
3.List findBySexOrderByNameDesc(String sex); //名称倒序

以上这篇Spring Data JPA 简单查询–方法定义规则(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

技术
下载桌面版
GitHub
百度网盘(提取码:draw)
Gitee
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:766591547
关注微信