前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Boot JPA的查询语句

Spring Boot JPA的查询语句

作者头像
程序那些事
发布2020-07-08 15:30:05
1.3K0
发布2020-07-08 15:30:05
举报
文章被收录于专栏:程序那些事程序那些事

Spring Boot JPA的查询语句

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

准备工作

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

代码语言:javascript
复制
        <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:

代码语言:javascript
复制
@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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
public interface MovieRepository extends JpaRepository<Movie, Long> {
}

Containing, Contains, IsContaining 和 Like

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

代码语言:javascript
复制
SELECT * FROM movie WHERE title LIKE '%in%';

我们可以这样写:

代码语言:javascript
复制
List<Movie> findByTitleContaining(String title);
List<Movie> findByTitleContains(String title);
List<Movie> findByTitleIsContaining(String title);

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

我们看下怎么测试:

代码语言:javascript
复制
@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 关键词,我们可以这样用:

代码语言:javascript
复制
List<Movie> findByTitleLike(String title);

测试代码:

代码语言:javascript
复制
results = movieRepository.findByTitleLike("%in%");
assertEquals(3, results.size());

StartsWith

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

代码语言:javascript
复制
SELECT * FROM Movie WHERE Rating LIKE 'PG%';

我们可以这样使用:

代码语言:javascript
复制
List<Movie> findByRatingStartsWith(String rating);

测试代码如下:

代码语言:javascript
复制
List<Movie> results = movieRepository.findByRatingStartsWith("PG");
assertEquals(6, results.size());

EndsWith

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

代码语言:javascript
复制
SELECT * FROM Movie WHERE director LIKE '%Burton';

可以这样构建:

代码语言:javascript
复制
List<Movie> findByDirectorEndsWith(String director);

测试代码如下:

代码语言:javascript
复制
List<Movie> results = movieRepository.findByDirectorEndsWith("Burton");
assertEquals(1, results.size());

大小写不敏感

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

代码语言:javascript
复制
List<Movie> findByTitleContainingIgnoreCase(String title);

测试代码如下:

代码语言:javascript
复制
List<Movie> results = movieRepository.findByTitleContainingIgnoreCase("the");
assertEquals(2, results.size());

Not

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

代码语言:javascript
复制
List<Movie> findByRatingNotContaining(String rating);

测试代码如下:

代码语言:javascript
复制
List<Movie> results = movieRepository.findByRatingNotContaining("PG");
assertEquals(1, results.size());

NotLike:

代码语言:javascript
复制
List<Movie> findByDirectorNotLike(String director);

测试代码如下:

代码语言:javascript
复制
List<Movie> results = movieRepository.findByDirectorNotLike("An%");
assertEquals(5, results.size());

@Query

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

代码语言:javascript
复制
@Query("SELECT m FROM Movie m WHERE m.title LIKE %:title%")
List<Movie> searchByTitleLike(@Param("title") String title);

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

代码语言:javascript
复制
@Query("SELECT m FROM Movie m WHERE m.rating LIKE ?1%")
List<Movie> searchByRatingStartsWith(String rating);

下面是测试代码:

代码语言:javascript
复制
List<Movie> results = movieRepository.searchByRatingStartsWith("PG");
assertEquals(6, results.size());

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

代码语言:javascript
复制
@Query("SELECT m FROM Movie m WHERE m.director LIKE %?#{escape([0])} escape ?#{escapeCharacter()}")
List<Movie> searchByDirectorEndsWith(String director);

看下怎么使用:

代码语言:javascript
复制
List<Movie> results = movieRepository.searchByDirectorEndsWith("Burton");
assertEquals(1, results.size());
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序那些事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 准备工作
  • Containing, Contains, IsContaining 和 Like
  • StartsWith
  • EndsWith
  • 大小写不敏感
  • Not
  • @Query
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档