Spring JPA之find拓展方法示例详解

目录
  • 前言
  • 一、单条件查询
    • 1、精确查询(确定值,例如:=、is)
    • 2、范围查询(一定范围,例如<、<=、>、>=、in、between)
      • a)运算符
      • b)between
      • c)in
    • 3、模糊查询
      • a)findByNameLike
      • b)findByNameStartingWith
  • 二、多条件查询
  • 三、关键字
  • 最后总结:

前言

前两篇我们详细了解了 findByIdfindAll 以及 findAll 的分页查询,如果说JPA只有上面的两种查询功能,那就太low了,今天让我们再深入的去探究一下其他查询方法。

一、单条件查询

类似 select * from * where 条件 的查询

1、精确查询(确定值,例如:=、is)

Dao 层(因为已经不是自带方法了,所以需要在Dao添加接口)

User findByName(String name);

控制台打印如下:

Hibernate:
    select
        user0_.id as id1_0_,
        user0_.age as age2_0_,
        user0_.name as name3_0_
    from
        user user0_
    where
        user0_.name=?

2、范围查询(一定范围,例如<、<=、>、>=、in、between)

a)运算符

Dao 层

/**
 * 小于age的数据
 * @param age
 * @return
 */
List<User> findByAgeLessThan(int age);
/**
 * 小于等于age的数据
 * @param age
 * @return
 */
List<User> findByAgeLessThanEqual(int age);

控制台打印如下:

Hibernate:
    select
        user0_.id as id1_0_,
        user0_.age as age2_0_,
        user0_.name as name3_0_
    from
        user user0_
    where
        user0_.age<?
Hibernate:
    select
        user0_.id as id1_0_,
        user0_.age as age2_0_,
        user0_.name as name3_0_
    from
        user user0_
    where
        user0_.age<=?

其他的“>”就是findByAgeGreaterThan,“>=”就是findByAgeGreaterThanEqual 等等

b)between

Dao 层

/**
 * age在ageLeft和ageRight之间的数据
 * @param ageLeft
 * @param ageRight
 * @return
 */
List&lt;User&gt; findByAgeBetween(int ageLeft,int ageRight);

控制台打印如下:

Hibernate:
    select
        user0_.id as id1_0_,
        user0_.age as age2_0_,
        user0_.name as name3_0_
    from
        user user0_
    where
        user0_.age between ? and ?

c)in

Dao 层

/**java
 * age在ints内的数据
 * @param ages
 * @return
 */
List<User> findByAgeIn(int[] ages);

控制台打印如下:

Hibernate:
    select
        user0_.id as id1_0_,
        user0_.age as age2_0_,
        user0_.name as name3_0_
    from
        user user0_
    where
        user0_.age in (
            ? , ?
        )

findByAgeNotIn的查询跟in结果是相对的,但是用法是一样的,传入的参数也是数组

3、模糊查询

模糊查询无非就是 like 语句,这里我们就不详细讨论 like 如何使用了,只介绍一下 JPA 中的 like 如何去实现。
以下是Dao 层的like实现的各接口:

public List<User> findByNameLike(String name){
    return userDao.findByNameLike(name);
}
public List<User> findByNameStartingWith(String name){
    return userDao.findByNameStartingWith(name);
}
public List<User> findByNameStartsWith(String name){
    return userDao.findByNameStartsWith(name);
}
public List<User> findByNameEndingWith(String name){
    return userDao.findByNameEndingWith(name);
}
public List<User> findByNameContaining(String name){
    return userDao.findByNameContaining(name);
}

上面虽然有5个不同的接口,但是控制台打印却是一致的,如下:

Hibernate:
    select
        user0_.id as id1_0_,
        user0_.age as age2_0_,
        user0_.name as name3_0_
    from
        user user0_
    where
        user0_.name like ? escape ?

那他们5个具体有啥区别呢?不急,我们详细看看:

a)findByNameLike

请求url findByNameLike?name=aa,控制台打印入参如下:

binding parameter [1] as [VARCHAR] - [aa]

从输入值可以看出,单独的like你传什么就将什么放在like后面;如果传的是纯字符,则相当于精确查询;如果你加上“%”,那就可以进行模糊查询了:findByNameLike?name=%25aa(url中的“%”转义为“%25”),控制台打印入参如下:

binding parameter [1] as [VARCHAR] - [%aa]

b)findByNameStartingWith

请求urlfindByNameStartingWith?name=aa,控制台打印入参如下:

binding parameter [1] as [VARCHAR] - [aa%]

从输入值来看,这个就是获取以“aa”开头的所有数据,其实从名字也可以看出来他的实际作用。后面的findByNameStartsWith跟这个的作用是一样的。
以此类推:
findByNameEndingWith(aa)findByNameEndsWith(aa): 输入值应为 [%aa],就是获取以“aa”为结尾的所有数据;
findByNameContaining(aa):输入值应为 [%aa%]\,就是获取任意位置包含“aa”的数据。

二、多条件查询

类似select* from * where 条件1 and 条件2Dao 层

User findByNameAndAge(String name, int age);

控制台打印如下:

Hibernate:
    select
        user0_.id as id1_0_,
        user0_.age as age2_0_,
        user0_.name as name3_0_
    from
        user user0_
    where
        user0_.name=?
        and user0_.age=?

多条件查询其实就是多个单条件查询所叠加的效果;主要使用 and 来表示同时满足多个条件的结果,而 or 用于表示满足其中一个条件的结果。

三、关键字

以下是整理的JPA支持的关键字,大家可以自行取之。

关键字 示例 JPQL片段
And findByNameAndAge ... where x.name = ?1 and x.age = ?2
Or findByNameOrAge ... where x.name = ?1 or x.age = ?2
Is,Equals findByName,findByNameIs,findByNameEquals ... where x.name = ?1
Between findByAgeBetween ... where x.age between ?1 and ?2
LessThan findByAgeLessThan ... where x.age < ?1
LessThanEqual findByAgeLessThanEqual ... where x.age <= ?1
GreaterThan findByAgeGreaterThan ... where x.age > ?1
GreaterThanEqual findByAgeGreaterThanEqual ... where x.age >= ?1
After findByAgeAfter ... where x.age > ?1
Before findByAgeBefore ... where x.age< ?1
IsNull findByAgeIsNull ... where x.age is null
IsNotNull,NotNull findByAge(Is)NotNull ... where x.age not null
Like findByNameLike ... where x.name like ?1
NotLike findByNameNotLike ... where x.name not like ?1
StartingWith findByNameStartingWith ... where x.name like ?1 (参数会绑定到%后面)
EndingWith findByNameEndingWith ... where x.name like ?1 (参数会绑定在%前面)
Containing findByNameContaining ... where x.name like ?1 (参数会绑定在两个%中间)
OrderBy findByAgeOrderByNameDesc ... where x.age = ?1 order by name desc
Not findByNameNot ... where x.name <> ?1
In findByAgeIn(Collection ages) ... where x.age in ?1
NotIn findByAgeNotIn(Connection ages) ... where x.age not in ?1
True findByActiveTrue() ... where x.active = true
Flase findByActiveFalse() ... where x.active = false
IgnoreCase findByNameIgnoreCase ... where UPPER(x.name) = UPPER(?1)

最后总结:

以上总结的这些关键字,大家可以直接用来在Dao层构造对应接口。其实从关键字的语法来看,基本就已经介绍了相关功能了,所以用起来其实也很方便,更多关于Spring JPA find拓展方法的资料请关注我们其它相关文章!

(0)

相关推荐

  • Spring JPA find单表查询方法示例详解

    目录 一.findById(ID id) 二.findAll() 三.findAllById(Iterable<ID> ids) 四.findAll(Sort sort) 单调排序 sort.by 源码 control层 五.findAll(Sort sort) 多参数排序 Sort by 源码 control 层 总结 一.findById(ID id) 通过id进行单条查询,先看看 findById(ID id) 的源码 @Override public Optional<T>

  • Spring JPA find分页示例详解

    目录 前言 源码 一.单纯分页查询 查询结果 结论 二.排序分页查询 查询结果 三.方法整理 总结: 前言 在现实项目中,数据量一般都不小,如果一次性全部请求出来,肯定是影响性能,而且大量数据展示到页面上观感也不好.这时我们就需要用到分页,给定一个 pageSize,每次请求的数量就是 pageSize 的大小,这样既可以节约时间,又可以美化页面.Spring JPA 就为我们提供这样一个方法,准确来说是提供了一个对象用来约束数据按照分页的形式进行请求. 源码 findAll(Pageable

  • Spring JPA联表查询之注解属性详解

    目录 前言 一.targetEntity 二.cascade 1.不定义 2.CascadeType.PERSIST 3.CascadeType.REMOVE 4.CascadeType.REFRESH 5.CascadeType.MERGE 6.CascadeType.ALL 三.fetch FetchType.LAZY FetchType.EAGER 四.mappedBy 五.orphanRemoval 前言 对于联表查询的四个注解 @OneToOne.@OneToMany.@ManyToO

  • Spring JPA学习之delete方法示例详解

    目录 一.deleteById 和 delete deleteById(Id id)(通过id进行删除) delete(T entity)(通过实体对象进行删除) 实例 service 层 control层 二.deleteAllById 和 deleteAll 1.deleteAllById(Iterable<? extends ID> ids)(通过id进行批量删除) 2.deleteAll(Iterable<? extends T> entities)(通过实体对象进行批量删

  • Spring JPA联表查询之OneToOne源码详解

    目录 前言 源码 注解属性 单向联表 user 实体类 car 实体类 查询结果 双向联表 user 实体 car 实体 查询结果 延迟加载(懒加载) user 实体 查询结果: 查询完会发现,控制台又打印了一个 JPQL: 最后结论 前言 前面几篇我们学习的都是单表查询,就是对一张表中的数据进行查询.而实际项目中,基本都会有多张表联合查询的情况,今天我们就来了解下JPA的联表查询是如做的. 源码 @OneToOne 注解实现一对一关系映射.比如用户跟车辆的关系(这里假设一个人只能有一辆车),一

  • Spring JPA之save方法示例详解

    目录 一.save(单条添加) 源码 service 层 control层 二.saveAll(批量添加) 源码 service control层 一.save(单条添加) 源码 @Transactional @Override public <S extends T> S save(S entity) { Assert.notNull(entity, "Entity must not be null."); if (entityInformation.isNew(enti

  • Spring JPA之find拓展方法示例详解

    目录 前言 一.单条件查询 1.精确查询(确定值,例如:=.is) 2.范围查询(一定范围,例如<.<=.>.>=.in.between) a)运算符 b)between c)in 3.模糊查询 a)findByNameLike b)findByNameStartingWith 二.多条件查询 三.关键字 最后总结: 前言 前两篇我们详细了解了 findById 和 findAll 以及 findAll 的分页查询,如果说JPA只有上面的两种查询功能,那就太low了,今天让我们再深

  • Go语言中的字符串处理方法示例详解

    1 概述 字符串,string,一串固定长度的字符连接起来的字符集合.Go语言的字符串是使用UTF-8编码的.UTF-8是Unicode的实现方式之一. Go语言原生支持字符串.使用双引号("")或反引号(``)定义. 双引号:"", 用于单行字符串. 反引号:``,用于定义多行字符串,内部会原样解析. 示例: // 单行 "心有猛虎,细嗅蔷薇" // 多行 ` 大风歌 大风起兮云飞扬. 威加海内兮归故乡. 安得猛士兮守四方! ` 字符串支持转义

  • 编译安装redisd的方法示例详解

    安装方法: yum安装 查看yum仓库redis版本 [root@centos ~]# yum list redis Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile Available Packages redis.x86_64 3.2.12-2.el7 myepel yum安装 [root@centos ~]# yum install redis -y 启动服务并设为开机启动

  • VSCode各语言运行环境配置方法示例详解

    系统环境变量的配置 如:将F:\mingw64\bin添加到系统环境变量Path中 VSCode软件语言json配置C语言 创建个.vscode文件夹,文件夹内创建以下两个文件 launch.json 文件配置 { "version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", "type": "cppdbg&

  • 浅谈使用Java Web获取客户端真实IP的方法示例详解

    Java-Web获取客户端真实IP: 发生的场景:服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等情况,在进行客户端IP限定的时候,需要首先获取该真实的IP. 一般分为两种情况: 方式一.客户端未经过代理,直接访问服务器端(nginx,squid,haproxy): 方式二.客户端通过多级代理,最终到达服务器端(nginx,squid,haproxy): 客户端请求信息都包含在HttpServletRequest中,可以通过方法getRemoteAddr()获得该客户端IP.

  • PHP基于phpqrcode类生成二维码的方法示例详解

    HP QR Code是一个PHP二维码生成类库,利用它可以轻松生成二维码,官网提供了下载和多个演示demo,查看地址: http://phpqrcode.sourceforge.net/ 下载官网提供的类库后,只需要使用phpqrcode.php就可以生成二维码了,当然您的PHP环境必须开启支持GD2. phpqrcode.php提供了一个关键的png()方法,其中 参数$text表示生成二位的的信息文本: 参数$outfile表示是否输出二维码图片 文件,默认否: 参数$level表示容错率,

  • Python面向对象编程repr方法示例详解

    目录 为什么要讲 __repr__ 重写 __repr__ 方法 str() 和 repr() 的区别 为什么要讲 __repr__ 在 Python 中,直接 print 一个实例对象,默认是输出这个对象由哪个类创建的对象,以及在内存中的地址(十六进制表示) 假设在开发调试过程中,希望使用 print 实例对象时,输出自定义内容,就可以用 __repr__ 方法了 或者通过 repr() 调用对象也会返回 __repr__ 方法返回的值 是不是似曾相识....没错..和 __str__ 一样的

  • jQuery编程动画的基本方法示例详解

    目录 一.动画 .show() .hide() .fadeIn() .fadeOut() .animate() .slideDown() .slideUp() .delay() .clearQueue() .fadeTo() 一.动画 jQuery提供了一些列的动画基本方法,同时也提供了自定动画方案.animate(). .show() 当提供一个 duration(持续时间)参数,.show()成为一个动画方法..show()方法将为匹配元素的宽度,高度,以及不透明度,同时进行动画操作. 持续

  • Go Java算法之外观数列实现方法示例详解

    目录 外观数列 方法一:遍历生成(Java) 方法二:递归(Go) 外观数列 给定一个正整数 n ,输出外观数列的第 n 项. 「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述. 你可以将其视作是由递归公式定义的数字字符串序列: countAndSay(1) = "1" countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串. 前五项如下: 1.1 —— 第一项是数字 1 2.11 —— 描述前一项,这个数

随机推荐