Spring Boot JPA的查询语句
Spring Boot JPA的查询语句
之前的文章中,我们讲解了如何使用Spring Boot JPA, 在Spring Boot JPA中我们可通过构建查询方法或者通过@Query注解来构建查询语句,本文我们将会更详细的讨论查询语句的构建。
准备工作
首先我们需要添加依赖,这里我们还是使用H2内存数据库:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
我们创建一个Entity:
@Data
@Entity
public class Movie {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
private String title;
private String director;
private String rating;
private int duration;
}
构建初始化data.sql:
INSERT INTO movie(id, title, director, rating, duration)
VALUES(1, 'Godzilla: King of the Monsters', ' Michael Dougherty', 'PG-13', 132);
INSERT INTO movie(id, title, director, rating, duration)
VALUES(2, 'Avengers: Endgame', 'Anthony Russo', 'PG-13', 181);
INSERT INTO movie(id, title, director, rating, duration)
VALUES(3, 'Captain Marvel', 'Anna Boden', 'PG-13', 123);
INSERT INTO movie(id, title, director, rating, duration)
VALUES(4, 'Dumbo', 'Tim Burton', 'PG', 112);
INSERT INTO movie(id, title, director, rating, duration)
VALUES(5, 'Booksmart', 'Olivia Wilde', 'R', 102);
INSERT INTO movie(id, title, director, rating, duration)
VALUES(6, 'Aladdin', 'Guy Ritchie', 'PG', 128);
INSERT INTO movie(id, title, director, rating, duration)
VALUES(7, 'The Sun Is Also a Star', 'Ry Russo-Young', 'PG-13', 100);
构建Repository:
public interface MovieRepository extends JpaRepository<Movie, Long> {
}
Containing, Contains, IsContaining 和 Like
如果我们想要构建模下面的模糊查询语句:
SELECT * FROM movie WHERE title LIKE '%in%';
我们可以这样写:
List<Movie> findByTitleContaining(String title);
List<Movie> findByTitleContains(String title);
List<Movie> findByTitleIsContaining(String title);
将上面的语句添加到Repository中就够了。
我们看下怎么测试:
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {QueryApp.class})
public class MovieRepositoryTest {
@Autowired
private MovieRepository movieRepository;
@Test
public void TestMovieQuery(){
List<Movie> results = movieRepository.findByTitleContaining("in");
assertEquals(3, results.size());
results = movieRepository.findByTitleIsContaining("in");
assertEquals(3, results.size());
results = movieRepository.findByTitleContains("in");
assertEquals(3, results.size());
}
}
Spring 还提供了Like 关键词,我们可以这样用:
List<Movie> findByTitleLike(String title);
测试代码:
results = movieRepository.findByTitleLike("%in%");
assertEquals(3, results.size());
StartsWith
如果我们需要实现下面这条SQL:
SELECT * FROM Movie WHERE Rating LIKE 'PG%';
我们可以这样使用:
List<Movie> findByRatingStartsWith(String rating);
测试代码如下:
List<Movie> results = movieRepository.findByRatingStartsWith("PG");
assertEquals(6, results.size());
EndsWith
如果我们要实现下面的SQL:
SELECT * FROM Movie WHERE director LIKE '%Burton';
可以这样构建:
List<Movie> findByDirectorEndsWith(String director);
测试代码如下:
List<Movie> results = movieRepository.findByDirectorEndsWith("Burton");
assertEquals(1, results.size());
大小写不敏感
要是想实现大小不敏感的功能我们可以这样:
List<Movie> findByTitleContainingIgnoreCase(String title);
测试代码如下:
List<Movie> results = movieRepository.findByTitleContainingIgnoreCase("the");
assertEquals(2, results.size());
Not
要想实现Not的功能,我们可以使用NotContains, NotContaining, 和 NotLike关键词:
List<Movie> findByRatingNotContaining(String rating);
测试代码如下:
List<Movie> results = movieRepository.findByRatingNotContaining("PG");
assertEquals(1, results.size());
NotLike:
List<Movie> findByDirectorNotLike(String director);
测试代码如下:
List<Movie> results = movieRepository.findByDirectorNotLike("An%");
assertEquals(5, results.size());
@Query
如果我们要实现比较复杂的查询功能,我们可以使用@Query,下面是一个命名参数的使用:
@Query("SELECT m FROM Movie m WHERE m.title LIKE %:title%")
List<Movie> searchByTitleLike(@Param("title") String title);
如果有多个参数,我们可以这样指定参数的顺序:
@Query("SELECT m FROM Movie m WHERE m.rating LIKE ?1%")
List<Movie> searchByRatingStartsWith(String rating);
下面是测试代码:
List<Movie> results = movieRepository.searchByRatingStartsWith("PG");
assertEquals(6, results.size());
在Spring Boot2.4之后,我们可以使用SpEL表达式:
@Query("SELECT m FROM Movie m WHERE m.director LIKE %?#{escape([0])} escape ?#{escapeCharacter()}")
List<Movie> searchByDirectorEndsWith(String director);
看下怎么使用:
List<Movie> results = movieRepository.searchByDirectorEndsWith("Burton");
assertEquals(1, results.size());
本文的例子可以参考
更多教程请参考 flydean的博客
Spring Boot JPA的查询语句的更多相关文章
- 【spring boot jpa】hql语句报错 :antlr.NoViableAltException: unexpected token: roleName
使用场景:在spring data jpa下使用@Query("hql语句") 然后在项目启动的时候报错 hql语句报错:antlr.NoViableAltException: u ...
- SPring boot jpa 封装查询条件
最近使用spring data jpa做了两个项目,对于动态查询的不友好做了个类似hibernate的封装,记录也分享下 首先定义一个所有条件的容器,继承Specification /** * 定义一 ...
- spring boot jpa 复杂查询 动态查询 连接and和or 模糊查询 分页查询
最近项目中用到了jpa,刚接触的时候有些激动,以前的到层忽然不用写sql不用去自己实现了,只是取个方法名就实现了,太惊艳了,惊为天人,但是慢慢的就发现不是这么回事了,在动态查询的时候,不知道怎么操作了 ...
- Spring Boot 入门系列(二十七)使用Spring Data JPA 自定义查询如此简单,完全不需要写SQL!
前面讲了Spring Boot 整合Spring Boot JPA,实现JPA 的增.删.改.查的功能.JPA使用非常简单,只需继承JpaRepository ,无需任何数据访问层和sql语句即可实现 ...
- springboot集成Spring Data JPA数据查询
1.JPA介绍 JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据.它的出现主要是为 ...
- 【Spring Data 系列学习】Spring Data JPA 基础查询
[Spring Data 系列学习]Spring Data JPA 基础查询 前面的章节简单讲解了 了解 Spring Data JPA . Jpa 和 Hibernate,本章节开始通过案例上手 S ...
- 【Spring Data 系列学习】Spring Data JPA 自定义查询,分页,排序,条件查询
Spring Boot Jpa 默认提供 CURD 的方法等方法,在日常中往往时无法满足我们业务的要求,本章节通过自定义简单查询案例进行讲解. 快速上手 项目中的pom.xml.application ...
- Spring Boot(五):Spring Boot Jpa 的使用
在上篇文章Spring Boot(二):Web 综合开发中简单介绍了一下 Spring Boot Jpa 的基础性使用,这篇文章将更加全面的介绍 Spring Boot Jpa 常见用法以及注意事项. ...
- Spring Boot Jpa 的使用
Spring Boot Jpa 介绍 首先了解 Jpa 是什么? Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范.它为 Java 开发人员提供了一种 ...
随机推荐
- 牛客寒假基础集训营 | Day1 J题—u's的影响力(水题)
Day1 J题-u's的影响力 有一天,kotori发现了一个和lovelive相似的游戏:bangdream.令她惊讶的是,这个游戏和lovelive居然是同一个公司出的! kotori经过一段时间 ...
- 1021 Deepest Root (25 分)
A graph which is connected and acyclic can be considered a tree. The height of the tree depends on t ...
- Blocked Billboard II题解--模拟到崩溃的模拟
前言 比赛真的状态不好(腐了一小会),导致差点爆0. 这个题解真的是在非常非常专注下写出来的,要不然真的心态崩. 题目 题目描述 奶牛Bassie想要覆盖一大块广告牌,她在之前已经覆盖了一小部分广告牌 ...
- 如果你的 pip 命令不能用,你可以这样解决
文章更新于:2020-04-05 注:如果想了解 pip 参数的使用参见:pip 命令参数以及如何配置国内镜像源 如何解决 pip 不能用的问题 一.你可能会遇到的问题 1.检查你敲命令的位置 2.如 ...
- 通过简单的ajax验证是否存在已有的用户名
首先来说说我对ajax的理解:简单地来说就是在不重新刷新页面的情况下,实现数据的调用获得更新. 我在这里介绍的是要过jquery封装好的ajax,大家可以去了解一下使用原生的XMLHttpReques ...
- Spring XML Bean 定义的加载和注册
前言 本篇文章主要介绍 Spring IoC 容器怎么加载 bean 的定义元信息. 下图是一个大致的流程图: 第一次画图,画的有点烂.
- 7.5 this关键字的使用;标准学生类的编写 、构造方法的格式
/** 学生类** 起名字我们要求做到见名知意.* 而我们现在的代码中的n和a就没有做到见名知意,所以我要改进.** 如果有局部变量名和成员变量名相同,在局部使用的时候,采用的是就近的原则. * 我们 ...
- go 中的WaitGroup
wait_group sync.WaitGroup 类型是并发安全的,也是开箱就能用的. 该类型有三个指针方法,即:Add,Done和Wait. sync.WaitGroup是一个结构体类型.其中一个 ...
- tf.nn.max_pool 池化
tf.nn.max_pool( value, ksize, strides, padding, data_format='NHWC', name=None ) 参数: value:由data_form ...
- AJ学IOS(51)多线程网络之GCD下载合并图片_队列组的使用
AJ分享,必须精品 合并图片(图片水印)第一种方法 效果 实现: 思路: 1.分别下载2张图片:大图片.LOGO 2.合并2张图片 3.显示到一个imageView身上 // 异步下载 dispatc ...