一、Spring Data Jpa方法定义的规则
简单条件查询
简单条件查询:查询某一个实体类或者集合。
按照Spring Data的规范的规定,查询方法以find | read | get开头(比如 find、findBy、read、readBy、get、getBy),涉及查询条件时,条件的属性用条件关键字连接,要注意的是:条件属性以首字母大写。框架在进行方法名解析时,会先把方法名多余的前缀截取掉,然后对剩下部分进行解析。
直接在接口中定义查询方法,如果是符合规范的,可以不用写实现,即不用写SQL,目前支持的关键字写法如下:
二、只有查询参数
定义一个Entity实体类:
class People{
private String firstName;
private String lastName;
}
以上使用and条件查询时,应这样写
findByLastNameAndFirstName(StringlastName,String firstName);
注意:条件的属性名称与个数要与参数的位置与个数一一对应
三、查询同时排序
如果方法的最后一个参数是 Sort 或者 Pageable 类型,也会提取相关的信息,以便按规则进行排序或者分页查询比如
Page findByName(String name, Pageable pageable);
List findByName(String name, Sort sort);
排序也可以这么写
List<Cus> findBySexOrderByName(String sex); //名称正序(正序时,推荐此方式,简单)
List<Cus> findBySexOrderByNameAsc(String sex); //名称正序(效果同上)
List<Cus> findBySexOrderByNameDesc(String sex); //名称倒序
四、查询参数是 对象里面的对象的属性
如,查询参数是ERole.EMemberAccount.memberCode 一般我们会这么写
@Query("select e from ERole e where e.memberAccount.memberCode = ?1")
List<ERole> findByMerchantCode(String merchantCode);
如果用命名规则可以这么写
List<ERole> findByMemberAccountMemberCode(String merchantCode);
查询方法解析流程
假如我们创建如下的查询:findByUserDepUuid(),框架在解析该方法时,首先剔除findBy,然后对剩下的属性进行解析,假设查询实体为Doc。
先判断userDepUuid (根据POJO(Plain Ordinary Java Object简单java对象,实际就是普通java bean)规范,首字母变为小写。)是否是查询实体的一个属性,如果根据该属性进行查询;如果没有该属性,继续第二步。
从右往左截取第一个大写字母开头的字符串(此处为Uuid),然后检查剩下的字符串是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设 user为查询实体的一个属性。
接着处理剩下部分(DepUuid),先判断user所对应的类型是否有depUuid属性,如果有,则表示该方法最终是根据 “Doc.user.depUuid” 的取值进行查询;否则继续按照步骤 2的规则从右往左截取,最终表示根据“Doc.user.dep.uuid” 的值进行查询。
可能会存在一种特殊情况,比如 Doc包含一个user的属性,也有一个 userDep 属性,此时会存在混淆。可以明确在属性之间加上 "_"以显式表达意图,比如"findByUser_DepUuid()" 或者"findByUserDep_uuid()"。
五、命名规则不适合动态查询
当查询条件为null时,如
- 实体定义:对于一个客户实体Cus,包含有name和sex,均是String类型。
- 查询方法定义:List<Cus> findByNameAndSex(String name,String sex);
- 使用时:dao.findByNameAndSex(null, "男");
- 后台生成sql片断:where (cus0_.name is null) and cus0_.sex=?
结论:当查询时传值是null时,数据库中只有该字段是null的记录才符合条件,并不是说忽略这个条件。也就是说,这种查询方式,只适合于明确查询条件必须传的业务,对于动态查询(条件多少是动态的,例如一般的查询列表,由最终用户使用时决定输入那些查询条件),这种简单查询是不能满足要求的。
强调:需要强调的是,命名规则也不适合delete insert update. 只适合简单查询
参考文章
https://blog.csdn.net/liyang_nash/article/details/80704089
https://www.cnblogs.com/jaejaking/p/7994233.html
https://blog.lqdev.cn/2018/10/31/springboot/chapter-thirty/