Spring Boot JPA的查询语句
2020/3/3 17:01:33
本文主要是介绍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的查询语句的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-27JavaScript面试真题详解与解答
- 2024-12-27掌握JavaScript大厂面试真题:新手入门指南
- 2024-12-27JavaScript 大厂面试真题详解与解析
- 2024-12-26网络攻防资料入门教程
- 2024-12-26SQL注入资料详解:入门必读教程
- 2024-12-26初学者指南:数据库服务漏洞项目实战
- 2024-12-26网络安全项目实战:新手入门指南
- 2024-12-26网络攻防项目实战入门教程
- 2024-12-26信息安全项目实战:从入门到初步应用
- 2024-12-26SQL注入项目实战:初学者指南