Spring Boot JPA的查询语句

之前的文章中,我们讲解了如何使用Spring Boot JPA, 在Spring Boot JPA中我们可通过构建查询方法或者通过@Query注解来构建查询语句,本文我们将会更详细的讨论查询语句的构建。

准备工作

首先我们需要添加依赖,这里我们还是使用H2内存数据库:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-jpa</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>com.h2database</groupId>
  7. <artifactId>h2</artifactId>
  8. <scope>runtime</scope>
  9. </dependency>

我们创建一个Entity:

  1. @Data
  2. @Entity
  3. public class Movie {
  4. @Id
  5. @GeneratedValue(strategy = GenerationType.SEQUENCE)
  6. private Long id;
  7. private String title;
  8. private String director;
  9. private String rating;
  10. private int duration;
  11. }

构建初始化data.sql:

  1. INSERT INTO movie(id, title, director, rating, duration)
  2. VALUES(1, 'Godzilla: King of the Monsters', ' Michael Dougherty', 'PG-13', 132);
  3. INSERT INTO movie(id, title, director, rating, duration)
  4. VALUES(2, 'Avengers: Endgame', 'Anthony Russo', 'PG-13', 181);
  5. INSERT INTO movie(id, title, director, rating, duration)
  6. VALUES(3, 'Captain Marvel', 'Anna Boden', 'PG-13', 123);
  7. INSERT INTO movie(id, title, director, rating, duration)
  8. VALUES(4, 'Dumbo', 'Tim Burton', 'PG', 112);
  9. INSERT INTO movie(id, title, director, rating, duration)
  10. VALUES(5, 'Booksmart', 'Olivia Wilde', 'R', 102);
  11. INSERT INTO movie(id, title, director, rating, duration)
  12. VALUES(6, 'Aladdin', 'Guy Ritchie', 'PG', 128);
  13. INSERT INTO movie(id, title, director, rating, duration)
  14. VALUES(7, 'The Sun Is Also a Star', 'Ry Russo-Young', 'PG-13', 100);

构建Repository:

  1. public interface MovieRepository extends JpaRepository<Movie, Long> {
  2. }

Containing, Contains, IsContaining 和 Like

如果我们想要构建模下面的模糊查询语句:

  1. SELECT * FROM movie WHERE title LIKE '%in%';

我们可以这样写:

  1. List<Movie> findByTitleContaining(String title);
  2. List<Movie> findByTitleContains(String title);
  3. List<Movie> findByTitleIsContaining(String title);

将上面的语句添加到Repository中就够了。

我们看下怎么测试:

  1. @Slf4j
  2. @RunWith(SpringRunner.class)
  3. @SpringBootTest(classes = {QueryApp.class})
  4. public class MovieRepositoryTest {
  5. @Autowired
  6. private MovieRepository movieRepository;
  7. @Test
  8. public void TestMovieQuery(){
  9. List<Movie> results = movieRepository.findByTitleContaining("in");
  10. assertEquals(3, results.size());
  11. results = movieRepository.findByTitleIsContaining("in");
  12. assertEquals(3, results.size());
  13. results = movieRepository.findByTitleContains("in");
  14. assertEquals(3, results.size());
  15. }
  16. }

Spring 还提供了Like 关键词,我们可以这样用:

  1. List<Movie> findByTitleLike(String title);

测试代码:

  1. results = movieRepository.findByTitleLike("%in%");
  2. assertEquals(3, results.size());

StartsWith

如果我们需要实现下面这条SQL:

  1. SELECT * FROM Movie WHERE Rating LIKE 'PG%';

我们可以这样使用:

  1. List<Movie> findByRatingStartsWith(String rating);

测试代码如下:

  1. List<Movie> results = movieRepository.findByRatingStartsWith("PG");
  2. assertEquals(6, results.size());

EndsWith

如果我们要实现下面的SQL:

  1. SELECT * FROM Movie WHERE director LIKE '%Burton';

可以这样构建:

  1. List<Movie> findByDirectorEndsWith(String director);

测试代码如下:

  1. List<Movie> results = movieRepository.findByDirectorEndsWith("Burton");
  2. assertEquals(1, results.size());

大小写不敏感

要是想实现大小不敏感的功能我们可以这样:

  1. List<Movie> findByTitleContainingIgnoreCase(String title);

测试代码如下:

  1. List<Movie> results = movieRepository.findByTitleContainingIgnoreCase("the");
  2. assertEquals(2, results.size());

Not

要想实现Not的功能,我们可以使用NotContains, NotContaining, 和 NotLike关键词:

  1. List<Movie> findByRatingNotContaining(String rating);

测试代码如下:

  1. List<Movie> results = movieRepository.findByRatingNotContaining("PG");
  2. assertEquals(1, results.size());

NotLike:

  1. List<Movie> findByDirectorNotLike(String director);

测试代码如下:

  1. List<Movie> results = movieRepository.findByDirectorNotLike("An%");
  2. assertEquals(5, results.size());

@Query

如果我们要实现比较复杂的查询功能,我们可以使用@Query,下面是一个命名参数的使用:

  1. @Query("SELECT m FROM Movie m WHERE m.title LIKE %:title%")
  2. List<Movie> searchByTitleLike(@Param("title") String title);

如果有多个参数,我们可以这样指定参数的顺序:

  1. @Query("SELECT m FROM Movie m WHERE m.rating LIKE ?1%")
  2. List<Movie> searchByRatingStartsWith(String rating);

下面是测试代码:

  1. List<Movie> results = movieRepository.searchByRatingStartsWith("PG");
  2. assertEquals(6, results.size());

在Spring Boot2.4之后,我们可以使用SpEL表达式:

  1. @Query("SELECT m FROM Movie m WHERE m.director LIKE %?#{escape([0])} escape ?#{escapeCharacter()}")
  2. List<Movie> searchByDirectorEndsWith(String director);

看下怎么使用:

  1. List<Movie> results = movieRepository.searchByDirectorEndsWith("Burton");
  2. assertEquals(1, results.size());

本文的例子可以参考

更多教程请参考 flydean的博客

Spring Boot JPA的查询语句的更多相关文章

  1. 【spring boot jpa】hql语句报错 :antlr.NoViableAltException: unexpected token: roleName

    使用场景:在spring data jpa下使用@Query("hql语句") 然后在项目启动的时候报错 hql语句报错:antlr.NoViableAltException: u ...

  2. SPring boot jpa 封装查询条件

    最近使用spring data jpa做了两个项目,对于动态查询的不友好做了个类似hibernate的封装,记录也分享下 首先定义一个所有条件的容器,继承Specification /** * 定义一 ...

  3. spring boot jpa 复杂查询 动态查询 连接and和or 模糊查询 分页查询

    最近项目中用到了jpa,刚接触的时候有些激动,以前的到层忽然不用写sql不用去自己实现了,只是取个方法名就实现了,太惊艳了,惊为天人,但是慢慢的就发现不是这么回事了,在动态查询的时候,不知道怎么操作了 ...

  4. Spring Boot 入门系列(二十七)使用Spring Data JPA 自定义查询如此简单,完全不需要写SQL!

    前面讲了Spring Boot 整合Spring Boot JPA,实现JPA 的增.删.改.查的功能.JPA使用非常简单,只需继承JpaRepository ,无需任何数据访问层和sql语句即可实现 ...

  5. springboot集成Spring Data JPA数据查询

    1.JPA介绍 JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据.它的出现主要是为 ...

  6. 【Spring Data 系列学习】Spring Data JPA 基础查询

    [Spring Data 系列学习]Spring Data JPA 基础查询 前面的章节简单讲解了 了解 Spring Data JPA . Jpa 和 Hibernate,本章节开始通过案例上手 S ...

  7. 【Spring Data 系列学习】Spring Data JPA 自定义查询,分页,排序,条件查询

    Spring Boot Jpa 默认提供 CURD 的方法等方法,在日常中往往时无法满足我们业务的要求,本章节通过自定义简单查询案例进行讲解. 快速上手 项目中的pom.xml.application ...

  8. Spring Boot(五):Spring Boot Jpa 的使用

    在上篇文章Spring Boot(二):Web 综合开发中简单介绍了一下 Spring Boot Jpa 的基础性使用,这篇文章将更加全面的介绍 Spring Boot Jpa 常见用法以及注意事项. ...

  9. Spring Boot Jpa 的使用

    Spring Boot Jpa 介绍 首先了解 Jpa 是什么? Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范.它为 Java 开发人员提供了一种 ...

随机推荐

  1. memcached-tool 工具

    perl memcached-tool server_ip:port stats 输出说明: pid memcache服务器的进程ID uptime 服务器已经运行的秒数 time 服务器当前的uni ...

  2. 细数Java项目中用过的配置文件(ini 篇)

    Java 菜鸟,会把可变的配置信息写死在代码里:Java 老鸟,会把可变的配置信息提取到配置文件中.坊间流传这么一句非科学的衡量标准,来评判程序员的级别. 那么,项目中的配置信息,你平时都是怎样来实现 ...

  3. Java线程通讯方法之wait()、nofity() 详解

    Java线程通讯方法之wait().nofity() 详解 本文将探讨以下问题: synchronized 代码块使用 notify()与notifyAll()的区别 Java wait(),noti ...

  4. Android 圆形图片库 CircleImageView

    高仿微信朋友圈 10s 视频裁剪 引语 晚上好,我是猫咪,我的公众号「程序媛猫咪」会推荐 GitHub 上好玩的项目,挖掘开源的价值,欢迎关注我. <Android 图片裁剪库 uCrop> ...

  5. Go gRPC进阶-超时设置(六)

    前言 gRPC默认的请求的超时时间是很长的,当你没有设置请求超时时间时,所有在运行的请求都占用大量资源且可能运行很长的时间,导致服务资源损耗过高,使得后来的请求响应过慢,甚至会引起整个进程崩溃. 为了 ...

  6. 【Selenium01篇】python+selenium实现Web自动化:搭建环境,Selenium原理,定位元素以及浏览器常规操作!

    一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 二.话不多说,直接开干,开始搭建自动化测试环境 这里以前在 ...

  7. 8.3 String 类的方法 使用分类

    String类的判断功能.获取功能. * String类的判断功能: * boolean equals(Object obj):比较字符串的内容是否相同 * boolean equalsIgnoreC ...

  8. 数据结构和算法(Golang实现)(8.1)基础知识-前言

    基础知识 学习数据结构和算法.我们要知道一些基础的知识. 一.什么是算法 算法(英文algorithm)这个词在中文里面博大精深,表示算账的方法,也可以表示运筹帷幄的计谋等.在计算机科技里,它表示什么 ...

  9. 如何实现Jenkins 编译结果通知到QQ好友及QQ群组<很遗憾 2019年1月1日腾讯停止了webqq机器人的服务支持>

    Jenkins-NotifyQQ NotifyQQ 运行于Docker 本文介绍mac 环境下实现Jenkins编译结果QQ即时通知 Jenkins 安装使用及iOS自动化打包,邮件通知请参考本人博客 ...

  10. 【python实现卷积神经网络】全连接层实现

    代码来源:https://github.com/eriklindernoren/ML-From-Scratch 卷积神经网络中卷积层Conv2D(带stride.padding)的具体实现:https ...