spring-data-JPA repository自定义方法规则


Spring Data JPA框架在进行方法名解析时,会先把方法名多余的前缀截取掉,比如find,findBy,read,readBy,get,getBy,然后对剩下的部分进行解析。
假如创建如下的查询:findByUserDepUuid(),框架在解析该方法时,首先剔除findBy,然后对剩下的属性进行解析,假设查询实体为Doc
1:先判断userDepUuid(根据POJO规范,首字母变为小写)是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,继续第二步;
2:从右往左截取第一个大写字母开头的字符串此处为UUID),然后检查剩下的字符串是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设用户为查询实体的一个属性;
3:接着处理剩下部分(DepUuid),先判断用户所对应的类型是否有depUuid属性,如果有,则表示该方法最终是根据“Doc.user.depUuid”的取值进行查询;否则继续按照步骤2的规则从右往左截取,最终表示根据“Doc.user.dep.uuid”的值进行查询。
4:可能会存在一种特殊情况,比如Doc包含一个用户的属性,也有一个userDep属性,此时会存在混合。可以明确在属性之间加上“_”以显式表达意思,比如“findByUser_DepUuid )“或者”findByUserDep_uuid()“

关键词样品JPQL片段
IsNotNullfindByAgeNotNull...其中x.age 不为空【年龄不为空】
喜欢findByNameLike...其中x.name是什么样的?【模糊查找是......】
不喜欢findByNameNotLike...其中x.name不喜欢?【模糊查找不是......】
从...开始findByNameStartingWith...其中x.name类似?(参数绑定附加%)【模糊匹配,类似使用%结尾】
EndingWithfindByNameEndingWith...其中x.name类似于?(参数与预置%绑定)【模糊匹配,类似使用%开始】
findByNameContaining...其中x.name like?(参数绑定在%中)[模糊匹配,类似使用%开头和结尾]
排序依据findByAgeOrderByName...其中x.age =?order by x.name desc 【查找后排序】
findByNameNot...其中x.name <>?【查找列不是...的】
findByAgeIn...哪里x.age在?
NotInfindByAgeNotIn...其中x.age不在?
真正findByActiveTrue...其中x.avtive = true
产品嫁接findByActiveFalse...其中x.active = false
和 findByNameAndAge...其中x.name =?和x.age =?2
要么findByNameOrAge...其中x.name =?或x.age =?2
之间findBtAgeBetween...其中x.age之间?和?2
少于findByAgeLessThan...其中x.age <?
比...更棒findByAgeGreaterThan...其中x.age>?
在那之后......
一片空白findByAgeIsNull...其中x.age为空

自定义查找实例:

    /**
     * 根据id查用户
     **/
    List<User> findByIdOrName(Long id,String name);

    /**
     * 根据id查用户
     **/
    User queryXXXXByName(String name);

    /**
     * 根据id查name
     **/
    User readNameById(Long id);

    /**
     * 查年龄为10岁的学生
     **/
    List<User> getByAge(int age);
三,Spring Data JPA分页查询:

    /**
     * 分页查询左右用户
     * @param pageable
     * @return
     */
    Page<User> findAll(Pageable pageable);

    /**
     * 分页查询id不是传入id的用户
     * @param id
     * @param pageable
     * @return
     */
    Page<User> findByIdNot(Long id,Pageable pageable);

【注意】分页查询,的结果页,,页接口继承自切片,这个接口有以下方法

public interface Slice<T> extends Iterable<T> {
    int getNumber();//返回当前页码

    int getSize();//返回当前页大小(可能不是一整页)

    int getNumberOfElements();//返回当前的元素数量

    List<T> getContent();//返回当前页的内容(查询结果)

    boolean hasContent();//判断是否有内容存在

    Sort getSort();//返回排序方式

    boolean isFirst();//判断是不是第一页

    boolean isLast();//判断是不是最后一页

    boolean hasNext();//判断是否还有下一页

    boolean hasPrevious();//判断是否上一页

    Pageable nextPageable();//返回下一页

    Pageable previousPageable();//返回上一页,如果当前已经是第一个,则返回,请求前一个可以是【null】。在调用此方法之前,客户端应该检查是否收到一个非值。

    <S> Slice<S> map(Converter<? super T, ? extends S> var1);//用给定的映射,映射当前的内容,为Slice
}
方法名关键字SQL
findById 其中id =?
findByIdIs其中id =?
findByIdEquals等于其中id =?
findByNameAndAgewhere name =?和年龄=?
findByNameOrAge要么where name =?或年龄=?
findByNameOrderByAgeDesc按顺序排列where name =?按年龄顺序排列
findByAgeNotIn不在年龄不在(?)
findByStatusTrue真正where status = true
findByStatusFalse其中status = false
findByAgeBetween之间年龄在哪?和?
findByNameNot名称<>?
findByAgeLessThan少于年龄<?
findByAgeLessThanEqualLessThanEqual年龄<=?
findByAgeGreaterThan比...更棒年龄>?
findByAgeGreaterThanEqualGreaterThanEqual年龄> =?
findByAgeAfter年龄>?
findByAgeBefore之前年龄<?
findByNameIsNull一片空白其中名称为空
findByNameNotNull不为空其中名称不为空
findByNameLike喜欢哪里的名字像?
findByNameNotLike不喜欢哪里的名字不像?
findByNameStartingWith从...开始名称如'?%'
findByNameEndingWithEndingWith名称如'%?'
findByNameContaining名称如'%?%'

代码中几个复杂的。 
findByNameAndAgeAndSex:表示where name =?和年龄=?和性=? 
findByNameInAndAgeIsNull:表示(?)中的名称和年龄为null 
findByNameAndAgeInAndSexIn:表示where name =?年龄(?)和性别(?)

可以看出关键字是可以连用的,查找都是用findBy +表中列名,表的列名还有关键字等等拼接时,它们的首字母要大写。 
本次就暂时写到这,如有错误请见谅




  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值