【Spring Data JPA自学笔记三】Spring Data JPA的基础和高级查询方法
文章目录
- 调用接口的基础方法查询
- Repository
- CrudRepository
- PagingAndSortingRepository
- JPARepository
- JpaSpecificationExecutor
- JPQL查询
- 什么是JPQL
- 使用JPQL
- 使用有参的JPQL修改数据库
- SQL查询
上一期我们初识了Spring Data JPA,完成了基本配置和简单查询。今天我们将深入了解Spring Data JPA提供的一些复杂查询方法。
调用接口的基础方法查询
上一期我们使用接口提供的findAll
方法进行基本查询,这次我们来深入了解一下Spring Data JPA的各种接口都提供了什么方法。
Repository
Repository
提供了一套基本的方法,不过需要手动声明才可以使用,其结构如下:
第一部分为方法,关键词有:
find(read / get)
delete(remove)
save
count
exists
query
stream
第二部分(可不写)为返回结果,关键词有:
Top(后可跟数字以指定返回个数,如Top5)
返回最大的结果All
返回所有结果First
返回第一个结果Distinct(DistinctFirst / DistinctTop)
返回去重的结果
第三部分为条件属性,要求首字母大写,若需要多条件查询,条件属性之间用条件关键字连接,关键字有:
And
/Or
/Between
LessThan
/GreaterThan
After
/Before
(用于时间类型的比较)IsNull
/IsNotNull(NotNull)
Like
/NotLike
StartingWith
/EndingWith
/Containing
OrderBy(Desc)
Not
(不等于) /In
/NotIn
TRUE
/FALSE
IgnoreCase
第二,第三部分之间用
By
连接
举例:
findAll()
查询所有findFirstByOrderByIdDesc()
查询以ID倒序返回的第一条结果…
CrudRepository
CrudRepository
继承自Repository
,提供了一套基本的CRUD方法:
save(S) / saveAll(Iterable<S>)
findById(ID) / findAll() / findAllById(Iterable<ID>)
delete(T) / deleteAll(Iterable<? extends T>) / deleteAll() / deleteById(ID)
count()
existsById(ID)
PagingAndSortingRepository
PagingAndSortingRepository
继承自CrudRepository
,提供了排序和分页方法:
findAll(Sort)
需要定义一个排序规则作为参数findAll(Pageable)
需要定义一个分页规则作为参数
JPARepository
JPARepository
继承自PagingAndSortingRepository
,返回类型由迭代器变为List,更加友好:
findAll() / findAll(Sort) / findAll(Example<S>) / findAll(Example<S>, Sort) / findAllById(Iterable<ID>)
saveAll(Iterable<S>) / saveAndFlush(S)
deleteInBatch(Iterable<T>) / deleteAllInBatch()
flush()
getOne(ID var1)
举例:
userDao.findAll(Sort.by(Sort.Direction.DESC, "id"))
userDao.findAll(PageRequest.of(0, 10))
*注: Sort和Pageable的公共构造函数已经在新版中被移除,请使用.of
和.by
实现
JpaSpecificationExecutor
这个接口单独存在,不继承以上接口,提供了多条件查询的支持,并可以添加排序和分页方法,需要搭配JPARepository
使用。
JPQL查询
什么是JPQL
JPQL是JPA的查询语句,其语法与SQL相似。
然而,SQL语句面向的是表字段,JPQL语句面向的则是类属性。
JPQL语法说明:
- 除了不能使用
select *(不写select即代表select *)
之外,结构都与SQL一样 - 其关键字指向的是类属性
- 需要传参时用
?
表示,并后跟数字表示参数顺序
使用JPQL
声明接口方法:
public interface UserDao extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User> {@Query("from User")List<User> findByJpql();@Query("select id, name from User")List<Object[]> findByJpqlw();
}
调用方法:
@Testpublic void TestFind(){List<User> userList = userDao.findByJpql();for (User user : userList){System.out.println(user);}System.out.println();List<Object []> users = userDao.findByJpql();for (Object[] user : users) {System.out.println(Arrays.toString(user));}}
输出结果:
Hibernate: select user0_.u_id as u_id1_0_, user0_.u_name as u_name2_0_ from user user0_
ID: 1, Name: 鹿目圆香
ID: 2, Name: 小木曾雪菜Hibernate: select user0_.u_id as col_0_0_, user0_.u_name as col_1_0_ from user user0_
[1, 鹿目圆香]
[2, 小木曾雪菜]Process finished with exit code 0
关于JPQL语句查询的返回值:
如果直接使用
from User
,没有指定返回值,就可以用List<User>
的形式返回结果;如果指定了返回值,如
select id, name from User
,就要使用List<Object []>
接收结果,因为此时无法判断返回类型。
使用有参的JPQL修改数据库
JPQL中,使用?
后跟数字的形式表示参数。
如果要修改数据库,请加上@Modifying
注解,并在调用方法时使用@Transactional
注解提供事务支持:
声明接口方法:
public interface UserDao extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User> {@Query("update User set name = ?2 where id = ?1")@Modifyingvoid updateByJpql(int id,String name);
}
调用方法:
@Transactional@Testpublic void TestUpdate() {userDao.updateByJpql(1, "冬马和纱");}
然而这样并不能改变数据表字段,因为事务默认回滚!
要解决这个问题,需要使用@Rollback(false)
显式声明不回滚:
@Transactional@Rollback(false)@Testpublic void TestUpdate() {userDao.updateByJpql(1, "冬马和纱");}
这样数据表就会被修改了:
mysql> select * from user;
+------+-----------------+
| u_id | u_name |
+------+-----------------+
| 1 | 冬马和纱 |
| 2 | 小木曾雪菜 |
+------+-----------------+
2 rows in set (0.00 sec)
SQL查询
Spring Data JPA中要使用SQL语句非常简单,只需要在@Query
注解中设定nativeQuery = true
即可,true表示使用SQL,false表示使用JPQL,默认为false.
当然,由于SQL语句无法指定返回的类,所以我们使用List<Object []>
接收返回值。
声明接口方法:
@Query(value = "select * from user", nativeQuery = true)List<Object[]> findBySql();
调用方法:
@Testpublic void TestFind() {List<Object[]> userList = userDao.findBySql();for (Object[] user: userList){System.out.println(Arrays.toString(user));}}
返回结果:
Hibernate: select * from user
[1, 冬马和纱]
[2, 小木曾雪菜]Process finished with exit code 0
【Spring Data JPA自学笔记三】Spring Data JPA的基础和高级查询方法相关推荐
- es笔记三之term,match,match_phrase 等查询方法介绍
首先介绍一下在 es 里有两种存储字符串的字段类型,一个是 keyword,一个是 text. keyword 在存储数据的时候是作为一个整体存储的,不会对其进行分词处理 text 存储数据的时候会对 ...
- [前端笔记——HTML介绍] 4.HTML文本基础+超链接+高级文本格式
[前端笔记--HTML介绍] 4.HTML文本基础+超链接+高级文本格式 1.HTML文本基础 1.1标题和段落 1.2列表 1.2.1无序列表(unordered) 1.2.2有序列表(ordere ...
- 【Spring Data JPA自学笔记五】一对多、多对多和级联
文章目录 数据库表的关系 一对多 多对多 Spring Data JPA实现一对多 基本配置 实现一对多 放弃维护权 Spring Data JPA实现多对多 基本配置 实现多对多 级联 之前的所有操 ...
- 【Spring Data JPA自学笔记二】初识Spring Data JPA
文章目录 Spring Data JPA是什么? Spring Data JPA的配置 配置pom.xml 配置applicationContext.xml Spring Data JPA的使用 Sp ...
- 【Spring Data JPA自学笔记一】JPA是什么?JPA访问数据库初体验
文章目录 JPA是什么? JDBC的诞生 JPA的诞生 如何使用JPA? 配置JPA 配置pom.xml 配置persistence.xml 实现POJO类 调用JPA方法 关于EntityManag ...
- 【2017版韩顺平老师SSM框架自学笔记】Spring
目录 第1章 Spring的基本介绍 1. spring学习的核心内容介绍 2. spring ioc的原理介绍 3. spring插件的安装 4. spring快速入门案例 第2章 Spring配置 ...
- Spring源码学习笔记:Spring设计模式对比和Spring的OOB,BOP,AOP,IOC,DI/DL
1.博客内容均出自于咕泡学院架构师第三期 2.架构师系列内容:架构师学习笔记(持续更新) 1.GOF 23总设计模式归纳 分类 设计模式 创建型 工厂方法模式(Factory Method).抽象工厂 ...
- 《spring揭秘》读书笔记三
bean的scope 1. singleton, scope默认值为singleton spring容器中 scope='singleton'与单例模式不是一个意思.标记为singleton的bean ...
- nios自学笔记三:nios常用外设C函数整理
该文章为Nios II学习中的外设C函数收集整理笔记,长期更新. 提示:以下是本篇文章正文内容,下面案例可供参考 一.PIO读写 1.1 对PIO进行写操作 (1)利用给定的宏定义函数,函数原型如下: ...
最新文章
- spring包镜像下载地址
- 计算机应用基础东师,2018年东师计算机应用基础.doc
- 踏上《软件设计精要与模式》第二版的征途
- 传热学环肋肋效率matlab程序,传热学 第二章第四节 通过肋片的导热.pdf
- c语言计算机培训,C语言计算机基础学习||新手入门必看
- Xposed框架安装失败
- 算法与数据结构面试题(6)-腾讯面试题
- 广东地区经纬度Python版
- 艾草减肚子方法非常有效 赛乐赛骗局是真的吗
- 如何将多张图片转换为pdf格式
- 分享几套Easypanel用户后台模板源码优化版
- h3c交换机重启_h3c交换机重置命令_h3c交换机如何初始化
- elementUI中级联选择器的使用
- 第十二章:email-mailbox:管理email归档-imaplib:IMAP4客户库-邮箱状态
- 昆石网络 VOS3000虚拟运营支撑系统任意文件读取漏洞
- React使用百度地图实现驾车路线规划
- 《鬼泣-巅峰之战》产品分析:如何将ACT游戏改编成ARPG手游 ​
- 133A 读注意的嘤嘤
- 评测3款最流行的安卓txt阅读器
- Java虚拟机:什么是Java,kafka架构和原理
热门文章
- 科蒂斯控制器故障代码_科蒂斯 控制器故障代码指示
- 基于词袋模型的语言生成模型
- 2021年A特种设备相关管理(电梯)免费试题及A特种设备相关管理(电梯)考试总结
- 苹果税降低了一半,这对于小企业是一个机会吗?
- UI 自动化测试框架:关键字驱动+数据驱动
- web.xml过滤html,Servlet过滤器两种配置方法(注解、配置web.xml文件)
- 从3,5,7游戏看为佐夫博弈
- 利用PCL点云下采样实现数据体素化
- 183 wnmp环境搭建和laravel
- 【报告分享】罗振宇2022“时间的朋友”跨年演讲全文(附下载)