文章目录

  • 调用接口的基础方法查询
    • 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的基础和高级查询方法相关推荐

  1. es笔记三之term,match,match_phrase 等查询方法介绍

    首先介绍一下在 es 里有两种存储字符串的字段类型,一个是 keyword,一个是 text. keyword 在存储数据的时候是作为一个整体存储的,不会对其进行分词处理 text 存储数据的时候会对 ...

  2. [前端笔记——HTML介绍] 4.HTML文本基础+超链接+高级文本格式

    [前端笔记--HTML介绍] 4.HTML文本基础+超链接+高级文本格式 1.HTML文本基础 1.1标题和段落 1.2列表 1.2.1无序列表(unordered) 1.2.2有序列表(ordere ...

  3. 【Spring Data JPA自学笔记五】一对多、多对多和级联

    文章目录 数据库表的关系 一对多 多对多 Spring Data JPA实现一对多 基本配置 实现一对多 放弃维护权 Spring Data JPA实现多对多 基本配置 实现多对多 级联 之前的所有操 ...

  4. 【Spring Data JPA自学笔记二】初识Spring Data JPA

    文章目录 Spring Data JPA是什么? Spring Data JPA的配置 配置pom.xml 配置applicationContext.xml Spring Data JPA的使用 Sp ...

  5. 【Spring Data JPA自学笔记一】JPA是什么?JPA访问数据库初体验

    文章目录 JPA是什么? JDBC的诞生 JPA的诞生 如何使用JPA? 配置JPA 配置pom.xml 配置persistence.xml 实现POJO类 调用JPA方法 关于EntityManag ...

  6. 【2017版韩顺平老师SSM框架自学笔记】Spring

    目录 第1章 Spring的基本介绍 1. spring学习的核心内容介绍 2. spring ioc的原理介绍 3. spring插件的安装 4. spring快速入门案例 第2章 Spring配置 ...

  7. Spring源码学习笔记:Spring设计模式对比和Spring的OOB,BOP,AOP,IOC,DI/DL

    1.博客内容均出自于咕泡学院架构师第三期 2.架构师系列内容:架构师学习笔记(持续更新) 1.GOF 23总设计模式归纳 分类 设计模式 创建型 工厂方法模式(Factory Method).抽象工厂 ...

  8. 《spring揭秘》读书笔记三

    bean的scope 1. singleton, scope默认值为singleton spring容器中 scope='singleton'与单例模式不是一个意思.标记为singleton的bean ...

  9. nios自学笔记三:nios常用外设C函数整理

    该文章为Nios II学习中的外设C函数收集整理笔记,长期更新. 提示:以下是本篇文章正文内容,下面案例可供参考 一.PIO读写 1.1 对PIO进行写操作 (1)利用给定的宏定义函数,函数原型如下: ...

最新文章

  1. spring包镜像下载地址
  2. 计算机应用基础东师,2018年东师计算机应用基础.doc
  3. 踏上《软件设计精要与模式》第二版的征途
  4. 传热学环肋肋效率matlab程序,传热学 第二章第四节 通过肋片的导热.pdf
  5. c语言计算机培训,C语言计算机基础学习||新手入门必看
  6. Xposed框架安装失败
  7. 算法与数据结构面试题(6)-腾讯面试题
  8. 广东地区经纬度Python版
  9. 艾草减肚子方法非常有效 赛乐赛骗局是真的吗
  10. 如何将多张图片转换为pdf格式
  11. 分享几套Easypanel用户后台模板源码优化版
  12. h3c交换机重启_h3c交换机重置命令_h3c交换机如何初始化
  13. elementUI中级联选择器的使用
  14. 第十二章:email-mailbox:管理email归档-imaplib:IMAP4客户库-邮箱状态
  15. 昆石网络 VOS3000虚拟运营支撑系统任意文件读取漏洞
  16. React使用百度地图实现驾车路线规划
  17. 《鬼泣-巅峰之战》产品分析:如何将ACT游戏改编成ARPG手游 ​
  18. 133A 读注意的嘤嘤
  19. 评测3款最流行的安卓txt阅读器
  20. Java虚拟机:什么是Java,kafka架构和原理

热门文章

  1. 科蒂斯控制器故障代码_科蒂斯 控制器故障代码指示
  2. 基于词袋模型的语言生成模型
  3. 2021年A特种设备相关管理(电梯)免费试题及A特种设备相关管理(电梯)考试总结
  4. 苹果税降低了一半,这对于小企业是一个机会吗?
  5. UI 自动化测试框架:关键字驱动+数据驱动
  6. web.xml过滤html,Servlet过滤器两种配置方法(注解、配置web.xml文件)
  7. 从3,5,7游戏看为佐夫博弈
  8. 利用PCL点云下采样实现数据体素化
  9. 183 wnmp环境搭建和laravel
  10. 【报告分享】罗振宇2022“时间的朋友”跨年演讲全文(附下载)