Spring JPA之find拓展方法示例详解
作者:烟雨戏江南 发布时间:2021-12-11 03:50:49
前言
前两篇我们详细了解了 findById 和 findAll 以及 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<User> 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 条件2
Dao 层
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拓展方法的资料请关注脚本之家其它相关文章!
来源:https://juejin.cn/post/7224007477289107515
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- 本文实例为大家分享了Java实现简单员工管理系统的具体代码,供大家参考,具体内容如下代码如下:import java.util.*;publ
- @RequestBody部分属性丢失问题描述JavaBean实现public class VerifyNewFriendApplyReq i
- 前言总是觉得对HashMap很熟悉,但最近连续被问到几个关于它的问题,才发现它其实并不简单。这里对关于它的一些问题做个总结,也希望能够大家一
- 一、整体设计1、需求分析池化技术是计算机中的一种设计模式,内存池是常见的池化技术之一,它能够有效的提高内存的申请和释放效率以及内存碎片等问题
- 1.try-catch异常处理说明Java提供try和catch块来处理异常,try块用于包含可能出错的代码。catch块用于处理try块中
- Java在1.5开始引入了注解,目前流行的框架都在用注解,可想而知注解的强大之处。以下通过自定义注解来深入了解java注解。一、创建自定义注
- 利用Java连接MySQL做登陆界面,供大家参考,具体内容如下1、首先需要建立一个类,在这里,我命名为newLoginnewLogin类的代
- 正则: “.”和"\""."点儿,在正则表达式中表示任意一个字符。"\"在正则表
- Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的
- 一.摘要emmmm..对springmvc不太熟练的情况下,如果不出意外的话,项目启动后出现404页面是很烦人。在这里,我记录一下可能会导致
- 最近在刷力扣上的题目,刷到了65不同路径,当初上大学的时候,曾在hihocoder上刷到过这道题目,但是现在已经几乎全忘光了,大概的知识点是
- 本文实例讲述了Java实现指定线程执行顺序的三种方式。分享给大家供大家参考,具体如下:方法一:通过共享对象锁加上可见变量来实现。public
- 需求: 使用IO流将指定目录下的若干个音频文件的高潮部分,进行剪切,并重新拼接成一首新的音频文件 思路(以两首歌为例):第一首歌有
- 现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件。邮件里面的内容可能包含了我们的注册的用户名和密码以
- 在request中可以获取到来自Http请求的body数据比如获取json格式数据代码:import com.alibaba.dubbo.c
- 一.创建Spring boot项目,添加如下依赖<dependency> <gro
- 1、什么是GradleGradle是一种结合了Ant和Maven两者优势的下一代构建工具,既有Ant构建灵活性的优点,也保留Maven约定优
- 1. 前言ResultSetMetaData 叫元数据,是数据库 列对象,以列为单位封装为对象。元数据,指的是其包含列名,列值,列类型,列长
- 一、容器初始化1、源码分析在jdk8的ConcurrentHashMap中一共有5个构造方法,这四个构造方法中都没有对内部的数组
- 前言本文主要给大家介绍了关于Java读取二进制文件的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。读Hex写CS