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

Spring Boot JPA的查询语句

作者头像
程序那些事
发布于 2020-07-08 07:30:05
发布于 2020-07-08 07:30:05
1.6K00
代码可运行
举报
文章被收录于专栏:程序那些事程序那些事
运行总次数:0
代码可运行

Spring Boot JPA的查询语句

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

准备工作

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        <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
代码运行次数:0
运行
AI代码解释
复制
@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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
public interface MovieRepository extends JpaRepository<Movie, Long> {
}

Containing, Contains, IsContaining 和 Like

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM movie WHERE title LIKE '%in%';

我们可以这样写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Movie> findByTitleContaining(String title);
List<Movie> findByTitleContains(String title);
List<Movie> findByTitleIsContaining(String title);

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

我们看下怎么测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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
代码运行次数:0
运行
AI代码解释
复制
List<Movie> findByTitleLike(String title);

测试代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
results = movieRepository.findByTitleLike("%in%");
assertEquals(3, results.size());

StartsWith

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM Movie WHERE Rating LIKE 'PG%';

我们可以这样使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Movie> findByRatingStartsWith(String rating);

测试代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Movie> results = movieRepository.findByRatingStartsWith("PG");
assertEquals(6, results.size());

EndsWith

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM Movie WHERE director LIKE '%Burton';

可以这样构建:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Movie> findByDirectorEndsWith(String director);

测试代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Movie> results = movieRepository.findByDirectorEndsWith("Burton");
assertEquals(1, results.size());

大小写不敏感

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Movie> findByTitleContainingIgnoreCase(String title);

测试代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Movie> results = movieRepository.findByTitleContainingIgnoreCase("the");
assertEquals(2, results.size());

Not

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Movie> findByRatingNotContaining(String rating);

测试代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Movie> results = movieRepository.findByRatingNotContaining("PG");
assertEquals(1, results.size());

NotLike:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Movie> findByDirectorNotLike(String director);

测试代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Movie> results = movieRepository.findByDirectorNotLike("An%");
assertEquals(5, results.size());

@Query

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Query("SELECT m FROM Movie m WHERE m.title LIKE %:title%")
List<Movie> searchByTitleLike(@Param("title") String title);

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Query("SELECT m FROM Movie m WHERE m.rating LIKE ?1%")
List<Movie> searchByRatingStartsWith(String rating);

下面是测试代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Movie> results = movieRepository.searchByRatingStartsWith("PG");
assertEquals(6, results.size());

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

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

看下怎么使用:

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
R2Cplus软路由配置插件Hello World篇
HelloWorld是一个以用户最佳主观体验为导向的插件,它支持多种主流协议和多种自定义视频分流服务,拥有精美的操作界面,并配上直观的节点信息
小生观察室
2022/04/14
3.3K0
R2Cplus软路由配置插件Hello World篇
R2Cplus软路由配置插件Passwall篇
PassWall具有分流、故障转移、自动恢复的功能,搭配自带的HaProxy负载均衡极大的保证了访问网站的稳定性与安全性
小生观察室
2022/03/31
29.8K0
R2Cplus软路由配置插件Passwall篇
R2Cplus软路由配置访问国外网站插件Passwall篇
PassWall 是Lineol 基于ShadowsocksR-Plus 修改的OpenWrt 访问国外网站插件。
小生观察室
2022/04/14
34.3K0
R2Cplus软路由配置访问国外网站插件Passwall篇
R2Cplus软路由写入第三方固件全过程
因互联网上固件种类很多,而且对于新人来说并不具备独立编译固件的能力,建议使用第三方固件方便快捷
小生观察室
2022/03/30
2.4K0
R2Cplus软路由写入第三方固件全过程
视频压制入门篇
视频文件里面装的是一条视频轨道(Video track),或称为视频流(Video stream),和一条音频轨道(Audio track),或称为音频流(Audio stream)。
小生观察室
2022/03/24
2.6K0
视频压制入门篇
R2Cplus软路由写入第三方固件全过程
因互联网上固件种类很多,而且对于新人来说并不具备独立编译固件的能力,建议使用第三方固件方便快捷
小生观察室
2022/04/14
1.8K0
R2Cplus软路由写入第三方固件全过程
OpenWrt配置双AdGuard实现DNS国内外分流
从去年改造了家里的网络到现在都很稳定,但是最近自建的出墙偶尔抽风,我一直使用的Hysteria协议,发现有版本升级,于是升级了服务端,最后发现还是不丝滑,发现是我现在用的openwrt中的passwall插件不支持端口跳跃功能, 所以在恩山论坛找了个最新的OpenWrt固件进行安装,前段时间刷到了一个利用双AdguardHome分流国内外DNS解析,说这样可以防DNS污染,反正这次要升级OpenWrt,所以就折腾了一下,为了保持以前服务正常使用,我直接重新启动了一个OpenWrt,等觉得没问题再销毁全部切换过来,本篇记录自己踩的坑,当水篇文章了~。
Lcry
2023/06/14
18.3K0
OpenWrt配置双AdGuard实现DNS国内外分流
截图自动添加水印
后台看到很多人留言问上篇文章xray联动crawlergo自动化扫描爬坑记中的截图水印是如何做的,是不是很复杂
小生观察室
2022/01/15
1.8K0
截图自动添加水印
群晖虚拟机安装lede软路由
首先打开群辉的套件中心,找到 Virtual Machine Manager 然后安装并打开。
jcjyxjs
2021/09/04
2.9K0
【从零开始学习Go语言】三.属于Go的Hello World
本教程使用的编辑器为Vs code 微软的一款开源的文本编辑器,可能有人说goland更好,聪明的人自由聪明的选择,如果需要使用goland但却没经济基础使用正版麻烦您移步到资讯社进行下载,VS code 请 点我下载
一只特立独行的兔先生
2020/03/25
4.1K0
【从零开始学习Go语言】三.属于Go的Hello World
Netgear网件R7000路由器折腾上网
1、刷机有风险,如果变砖请自行解决; 2、固件版本来源于http://koolshare.cn; 3、教程网页打开之后不要随意刷新(毕竟刷机过程中大部分时间处于断网状态); 4、网件路由器设置相比TP-Link、D-Link(其它的我没用过,不会。)等复杂一些; 5、刷梅林固件过程也比较繁琐,一定要按顺序操作; 6、刷完梅林固件之后需要离线安装上网工具才能上网; 7、梅林过渡固件版本(R7000_380.70_0-X7.9.1-koolshare.chk); 8、梅林固件版本(R7000_380.70_0-X7.9.1-koolshare.trx); 9、上网工具版本(shadowsocks_4.1.7); 10、(OFW)固件版本(Merling-R7000-back-to-ofw.trx); 11、官方固件版本(R7000-V1.0.9.42_10.2.44.chk); 12、其它固件版本请自行解决; 13、以上固件及工具链接在教程中附上;
匿名用户的日记
2021/12/14
7.5K0
Netgear网件R7000路由器折腾上网
Ubuntu下利用MyEclipse开发Hadoop程序
开发的大环境是Ubuntu 11.04,Hadoop 0.20.2,MyEclipse 9.1
星哥玩云
2022/07/03
2850
Ubuntu下利用MyEclipse开发Hadoop程序
自建grafana对接云原生监控进行个性化配置
现在很多人为了能够更好的监控腾讯云上的tke集群,都会直接使用腾讯云托管的prometheus服务云原生监控来监控集群。腾讯云云原生监控服务(Tencent Prometheus Service,TPS)是针对云原生服务场景进行优化的监控和报警解决方案,全面支持开源 Prometheus 的监控能力,为用户提供轻量、稳定、高可用的云原生 Prometheus 监控服务。借助 TPS,您无需自行搭建 Prometheus 监控系统,也无需关心数据存储、数据展示、系统运维等问题,只需简单配置即可享受支持多集群的高性能云原生监控服务。
聂伟星
2022/03/30
2.6K3
第十一章:vue路由配置01基础
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JrteIv8T-1655272924474)(assets/image-20220226140815179.png)]
张哥编程
2024/12/13
2880
01.golang hello world(sublime 安装配置汉化)
Go 语言特色 简洁、快速、安全 并行、有趣、开源 内存管理、数组安全、编译迅速 ---- Go 安装 Golang中国下载 ---- Go环境变量与工作目录 根据约定,GOPATH下需要建立3个目录: bin(存放编译后生成的可执行文件) pkg(存放编译后生成的包文件) src(存放项目源码) ---- Go常用命令简介 go get:获取远程包(需 提前安装 git或hg) go run:直接运行程序 go build:测试编译,检查是否有编译错误 go fmt:格式化源码(部分IDE在保存时自动调用
qubianzhong
2018/08/02
6290
01.golang hello world(sublime 安装配置汉化)
巧用按量付费云服务器编译 openwrt 路由固件
首先,能这么简单的完成路由器 openwrt 固件的定制和编译,离不开 openwrt 社区和 L大 及其它贡献者的无私贡献和努力,在此感谢他们。
jwj
2021/08/25
5.5K0
巧用按量付费云服务器编译 openwrt 路由固件
springboot第37集:kafka,mqtt,Netty,nginx,CentOS,Webpack
binzookeeper-server-start.shconfigzookeeper.properties.png
达达前端
2023/10/08
2680
springboot第37集:kafka,mqtt,Netty,nginx,CentOS,Webpack
Docker最全教程——从理论到实战(六)
托管到腾讯云容器服务,我们的公众号“magiccodes”已经发布了相关的录屏教程,大家可以结合本篇教程一起查阅。
心莱科技雪雁
2018/12/28
1.4K0
Docker最全教程——从理论到实战(六)
云原生监控配置自建alertmanager实现告警
当前k8s的主流监控软件主要是prometheus,为了能够更好的监控腾讯云上的tke集群,腾讯云也推出了prometheus的服务,叫做云原生监控,云原生监控可以一键监控我们的tke集群,当然也支持配置告警,云原生监控的告警也是采用的alertmanager,这里是支持自建的和默认配置的,如果你没有自己部署alertmanager,云原生监控会在后台部署一个alertmanager来进行告警配置和发生,但是默认部署的alertmanager为了适配腾讯云,告警渠道暂时只有腾讯云的消息发生渠道和webhook。
聂伟星
2021/03/29
1.9K0
WDCP应用篇之https之路
在已经有大量的网站走上https之路的时候,对于https的需求也日益增加,似乎https已经成为一种普遍性需求,于是我们就申请了一波免费的DV证书:https://console.cloud.tencent.com/ssl
相柳
2019/05/22
4.1K0
WDCP应用篇之https之路
相关推荐
R2Cplus软路由配置插件Hello World篇
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档