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

2023-10-27


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片段
IsNotNull findByAgeNotNull ...其中x.age 不为空【年龄不为空】
喜欢 findByNameLike ...其中x.name是什么样的?【模糊查找是......】
不喜欢 findByNameNotLike ...其中x.name不喜欢?【模糊查找不是......】
从...开始 findByNameStartingWith ...其中x.name类似?(参数绑定附加%)【模糊匹配,类似使用%结尾】
EndingWith findByNameEndingWith ...其中x.name类似于?(参数与预置%绑定)【模糊匹配,类似使用%开始】
findByNameContaining ...其中x.name like?(参数绑定在%中)[模糊匹配,类似使用%开头和结尾]
排序依据 findByAgeOrderByName ...其中x.age =?order by x.name desc 【查找后排序】
findByNameNot ...其中x.name <>?【查找列不是...的】
findByAgeIn ...哪里x.age在?
NotIn findByAgeNotIn ...其中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 =?
findByNameAndAge where name =?和年龄=?
findByNameOrAge 要么 where name =?或年龄=?
findByNameOrderByAgeDesc 按顺序排列 where name =?按年龄顺序排列
findByAgeNotIn 不在 年龄不在(?)
findByStatusTrue 真正 where status = true
findByStatusFalse 其中status = false
findByAgeBetween 之间 年龄在哪?和?
findByNameNot 名称<>?
findByAgeLessThan 少于 年龄<?
findByAgeLessThanEqual LessThanEqual 年龄<=?
findByAgeGreaterThan 比...更棒 年龄>?
findByAgeGreaterThanEqual GreaterThanEqual 年龄> =?
findByAgeAfter 年龄>?
findByAgeBefore 之前 年龄<?
findByNameIsNull 一片空白 其中名称为空
findByNameNotNull 不为空 其中名称不为空
findByNameLike 喜欢 哪里的名字像?
findByNameNotLike 不喜欢 哪里的名字不像?
findByNameStartingWith 从...开始 名称如'?%'
findByNameEndingWith EndingWith 名称如'%?'
findByNameContaining 名称如'%?%'

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

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




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring-data-JPA repository自定义方法规则 的相关文章

随机推荐

  • shell编程100例

    版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net yugemengjing article details 82469785
  • intel至强服务器芯片制程,神器地位再巩固 !Intel 至强E3-1230/1220 V5测试

    2015年8月Intel正式发布了新一代微架构Skylake来替代当下的Broadwell 新一代的Skylake 是英特尔第六代微处理器架构 最主要的特征便是采用14纳米制程以及支持DDR4内存 Intel每一代处理器家族中都有一系列被中
  • python枚举之Enum模块详解

    简介 当我们需要定义一些特定有限数量的常量 标签 类型等的时候 最佳方式就是使用枚举 枚举一般用于表示某些特定的有限集合 例如月份 季节 星期等 本篇主要介绍python2 7中的枚举类 即enum中的Enum类 python3 4开始有内
  • 终端显示 Git 当前所在分支

    1 进入你的home目录 cd 2 编辑 bashrc文件 vi bashrc 将下面的代码加入到文件的最后处 function git branch branch git branch 2 gt dev null grep sed e s
  • TCP select 轮询服务器

    include
  • [RequireComponent(typeof(....))]

    当某个脚本必须依赖其他脚本或者组件共同使用时 为了避免人为添加过程的操作失误 可以在代码中使用RequireComponent 它的作用就是添加该脚本时 会自动将所依赖的各个组件添加至gameobject上 避免人为操作的失误 例 Requ
  • 毕业季到了,用C/C++做一张表白图片吧

    一转眼又到了毕业季 大学里相伴四年之人也将各奔东西 这其中不乏你的好兄弟 好闺蜜 也有你暗恋许久的人 不如就趁这最后的时间 勇敢一次 用我们的专业技术做一张表白图片送给她 他 吧 目录 先看效果 一 原理 二 代码实现 1 首先我们需要安装
  • 其他引用形式(引用指针、引用数组)

    1 没有引用的引用 但有指针的引用 2 可以对数组进行引用 引用一般为左值引用 给已有的实例取别名 一般都是用一个 进行引用 很少使用 如果是两个 就不代表二级引用 代表的是右值引用 左右值得区分可看我别的文章那 下附链接 左值与右值 A
  • sqlplus命令

    1 登录 1 1 sqlplus nolog conn scott tiger 或 conn scott tiger 192 168 1 12 orcl 1 2 sqlplus scott tiger 1 3 sqlplus as sysd
  • 如何用U盘启动做系统启动盘,如何重装系统

    一般重装系统大多会使用镜像刻录工具 把iso镜像刻录到U盘 今天我们使用官方的工具来刻录U盘 首先我们要格式化U盘 然后进入windows下载官网 这里以win11为例 Win11 https www microsoft com zh cn
  • C++ 拷贝构造函数中的Private权限问题

    引言 在C 中 拷贝构造函数是用于创建一个对象的副本的特殊成员函数 拷贝构造函数通常被定义为公有成员函数 以便其他对象能够使用它来创建副本 然而 有些人可能会对拷贝构造函数能否访问私有成员变量产生疑问 本文将详细探讨C 拷贝构造函数中的Pr
  • 分享串口接收中断只能接收到一个字节的其中一个原因

    问题 今天来分享一个我这两天遇到的一个很狗血的问题 就是我在写一个新项目串口部分时候 发现串口怎么只能接收到一个字节 因为我用的是接收中断RBEN吗 每接收到一个字节都会中断一次 可是这次我发现我每次怎么只能收到一个字节 然后我调试了一遍发
  • 宇宙第一 IDE Visual Studio 要放弃 Mac 了

    当地时间 8 月 30 日 微软在其官网发文称 已经关停 Visual Studio for Mac 的开发 相关支持将于 2024 年 8 月 31 日结束 微软将继续支持最新版本的 Mac IDE 集成开发环境 根据相关通知 使用 NE
  • 遗传算法的matlab实现

    遗传算法 Genetic Algorithm GA 是20世纪70年代初兴起的一门新兴学科 遗传算法的基本思想来源于达尔文的进化论和孟德尔的遗传学说 它通过模拟生物进化的过程来求解问题 生物中的基因对应优化问题中的变量组合 一个解则代表了一
  • 数据结构与算法 学习摘要

    时间复杂度比较 O 1 lt O logn lt O n lt O nlogn lt O n 2 lt O n 3 线性表 栈 stack 后进先出 队列 queue 先进先出 链表 linkedlist 单链表 双链表 https git
  • Linux8 如何重启网络服务

    本文主要讲解如何重启RHEL 8或者CentOS 8网络以及如何解决RHEL8和CentOS8系统的网络管理服务报错 当我们安装好RHEL 8或者 CentOS 8 重启启动网络时 会出现以下报错 systemctl restart net
  • 板子接线图

    1 ST LINK V2接线 2 对抗板子刷蓝牙固件 接USB转TTL 用镊子短接两个孔 2 对抗板子用串口测试蓝牙AT命令 短接白色箭头 接TX RX 电源
  • 嵌入式开发面试中经常被问到的问题记录

    问题 你能介绍一下你最熟悉的处理器架构及其特点吗 在嵌入式开发中 你通常使用哪些编程语言 对于不同的应用场景 如何选择适合的编程语言 请描述一下您在项目中遇到的最具挑战性的问题 并解释您是如何解决这个问题的 如何设计和实现一个多线程嵌入式系
  • JavaScript:从入门到精通总结二

    7 代码块 1 代码块只有分组的功能 代码块内部的内容 外部完全可见 2 prompt 弹出提示框 并且该提示框会带有一个文本框 返回值是string类型 3 switch语句中条件表达式是进行全等比较 4 可以为循环语句创建一个label
  • spring-data-JPA repository自定义方法规则

    Spring Data JPA框架在进行方法名解析时 会先把方法名多余的前缀截取掉 比如find findBy read readBy get getBy 然后对剩下的部分进行解析 假如创建如下的查询 findByUserDepUuid 框