【Spring Boot】Spring Boot中的简单查询
前面介绍了在Spring Boot项目中集成JPA框架,实现数据的增、删、改、查等功能。Spring Data JPA的使用非常简单,只需继承JpaRepository即可实现完整的数据操作方法,无须任何数据访问层和SQL语句。JPA除了这些功能和优势之外,还有非常强大的数据查询功能。以前复杂的查询都需要拼接很多查询条件,JPA有非常方便和优雅的方式来解决。接下来就聊一聊JPA的查询功能,从而体验Spring Data JPA的强大。
1.预生成方法
前面介绍了JpaRepository接口实现访问数据库的所有关键接口,比如exists()、save()、findAll()、delete()等方法。创建UserRepository类继承JpaRepository类,拥有父类中所有预先生成的方法。
调用这些方法也特别简单,上面所有JpaRepository父类拥有的方法都可以直接调用,无须声明。示例代码如下:
userRespository.existsByld((long) 1);
userRespository.save(user);
userRespository.findById((long) 1);
userRespository.findAll();
userRespository.delete(user);
userRespository.deleteById((long) 1);
2.自定义简单查询
JPA除了可以直接使用JpaRepository接口提供的基础功能外,还支持根据实体的某个属性实现数据库操作,Spring Data JPA能够根据其方法名为其自动生成SQL,支持的关键字有find、query、get、read、count、delete等,主要的语法是findByXX、queryByXX、getByXX、readByXX、countByXX等。利用这个功能,仅需要在定义的Repository中添加对应的方法名即可,无须具体实现,使用时Spring Data JPA会自动根据方法名来生成SQL语句。
2.1 属性查询
如果想根据实体的name属性来查询User的信息,那么直接在UserRepository中增加一个接口声明即可:
User findByUserName(String userName);
从上面的示例可以看到,我们可以在UserRepository接口中声明findByUserName方法,无须实现,JPA会自动生成对应的实现方法及其SQL语句。
2.2 组合查询
JPA不仅支持单个属性查询,还支持多个属性查询,根据And、Or等关键字进行组合查询,示例代码如下:
User findByNameOrPassword (String name, String password);
在上面的示例中,根据姓名和密码两个属性组合查询,属性名称与个数要与参数的位置与个数一一对应。可以根据查询的条件不断地添加和拼接,Spring Data JPA都可以正确解析和执行。
2.3 JPA关键字
JPA的自定义查询除了And、Or关键字外,基本上SQL语法中的关键字JPA都支持,比如like、between等。
按照Spring Data的规范,查询方法以find、read、get开头。涉及查询条件时,条件的属性用条件关键字进行连接。需要注意的是,条件属性首字母大写。
3.自定义SQL查询
一般的数据查询功能都可以通过定义方法名的方式来实现。但是有些特殊的场景,可能需要自定义的SQL来实现数据查询功能。Spring Data JPA同样可以完美支持,Spring Data JPA提供了@Query注解,通过注解可以自定义HQL或SQL实现复杂的数据查询功能。下面通过示例程序演示@Query注解实现自定义SQL查询。
3.1 HQL查询
在对应查询方法上使用@Query注解,在注解内写HQL来查询内容:
@Query("select u from User u")
List<User> findALL();
在上面的示例中,使用@Query注解定义自定义的HQL语句,实现自定义HQL语句查询。使用HQL比原生的SQL可读性更强,实现面向对象的方式操作数据。使用HQL时需要注意:
1)from后面跟的是实体类,而不是数据表名。
2)查询字段使用的是实体类中的属性,而不是数据表中的字段。
3)select后面不能跟“*”,应为实体类中的属性。
3.2 SQL查询
JPA除了支持HQL语句查询外,还可以直接使用SQL语句,这样比较直观,只需再添加一个参数“nativeQuery = true”即可:
@Query(value="select * from user u where u.name = ?1",nativeQuery = true)
List<User> findByName(String name);
上面示例中的“?1”表示方法参数中的顺序,“nativeQuery = true”表示执行原生SQL语句。除了按照这种方式传参外,还可以使用@Param传值方式:
@Query(value="select u from User u where u.password = :password")
List<User> findByPassword(@Param("password") String password);
3.3 修改和删除
除了自定义查询语句外,@Query注解同样可以用于定义修改和删除语句,只不过还需要加上@Modifying注解。示例代码如下:
@Modifying
@Query("update User set userName = ?1 where id = ?2")
int modifyById(String userName, Long id);@Modifying
@Query("delete from User where id = ?1")
void deleteUserById(Long id);
在上面的示例中,自定义delete和update语句需要添加@Modifying注解。需要注意的是,使用时需要在Repository或者更上层增加@Transactional注解,确保数据能成功写入数据库。
4.已命名查询
除了使用@Query注解外,还可以使用@NamedQuery与@NameQueries等注解定义命名查询。JPA的命名查询实际上就是给SQL查询语句起一个名字,执行查询时就是直接使用起的名字,避免重复写JPQL语句,使得查询方法能够复用。下面通过示例程序演示JPA已命名查询。
4.1 定义命名查询
在实体类中,@NamedQuery注解定义一个命名查询语句,示例代码如下:
@Entity
@Table(name="user")
@NamedQuery(name="findAllUser", query="SELECT U FROM User u")
public class User {}
在上面的示例中,@NamedQuery中的name属性指定命名查询的名称,query属性指定命名查询的语句。如果要定义多个命名查询方法,则需要使用@NamedQueries注解:
@Entity
@Table(name="users")
@NamedQueries({@NamedQuery(name = "findAllUser", query = "SELECT U FROM User u"),@NamedQuery(name = "findUserWithId", query = "SELECT U FROM User u WHERE u.id = ?1"),@NamedQuery(name = "findUserWithName", query = "SELECT U FROM User u WHERE u.name = :name")
})
public class User {}
在上面的示例中,在User实体类中定义了findAllUser()、findUserWithId()、findUserWithName()三种方法。
4.2 调用命名查询
定义命名查询后,可以使用EntityManager类中的createNamedQuery()方法传入命名查询的名称来创建查询:
@ResourceEntityManagerFactory emf;@Testpublic void testNamedQuery() {EntityManager em = emf.createEntityManager();// 根User实体中定义的命名查询Query query = em.createNamedQuery("findUserWithName");query.setParameter("name", "ysxq");List<User> users = query.getResultList();for (User u : users) {System.out.println("name:" + u.getName() + ",age:" + u.getAge());}}
在上面的示例中,使用createNamedQuery创建对应的查询,JPA会先根据传入的查询名查找对应的NamedQuery,然后通过调用getResultList()方法执行查询并返回结果。
除了使用@NamedQuery注解的方式之外,Spring Data JPA提供的Named查询可以支持将SQL语句写至XML文件中,实现SQL与Java代码的分离。在resources/META-INF目录下创建orm.xml文件并定义命名方法,参考配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings version="2.0"xmlns="http://java.sun.com/xml/ns/persistence/orm"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/ormhttp://www.oracle.com/webfolder/technetwork/jsc/xml/ns/persistence/orm_2_2.xsd"><named-native-query name="findUserWithName2" result-class="com.example.ysxq.model.User"><description>通过name查询用户数据</description><query>select u.id , u.name , u.password , u.age from users u where u.name = :name</query></named-native-query>
</entity-mappings>
在orm.xml文件中使用标签定义queryByName的命名查询,使用XML的方式与使用@NamedQuery注解方式的效果是一样的。只是将SQL语句写至XML文件中,实现SQL与Java代码的分离,使得定义的Java实体类看起来不那么复杂、臃肿。
相关文章:
【Spring Boot】Spring Boot中的简单查询
前面介绍了在Spring Boot项目中集成JPA框架,实现数据的增、删、改、查等功能。Spring Data JPA的使用非常简单,只需继承JpaRepository即可实现完整的数据操作方法,无须任何数据访问层和SQL语句。JPA除了这些功能和优势之外,还有非…...

Transformer 01(自注意机制Self-attention)
一、Self-attention [台大李宏毅] 1.1 向量序列的输入 一个序列作为输入: 多个向量输入举例: 一个句子: 声音信号: 图: 1.2 输出 二、Sequence labeling 输入与输出一样多:Sequence labeling 窗口开的…...

交流共享,共筑智算底座丨九州未来受邀出席英特尔线下沙龙
随着AI技术的升级迭代、生成式AI模型智能化水平的持续提升,AIGC加速向多种场景渗透,AIGC迎来应用爆发期,有望实现且跨越更多领域的融合,形成新的应用场景和解决方案,持续推动数字技术的创新与应用,助力各行…...

【EI会议信息】第五届土木建筑与城市工程国际学术会议(ICCAUE 2023)
第五届土木建筑与城市工程国际学术会议(ICCAUE 2023) 2023 5th International Conference on Civil Architecture and Urban Engineering (ICCAUE 2023) 第五届土木建筑与城市工程国际学术会议(ICCAUE 2023)由天津大学主办&…...

上海亚商投顾:沪指震荡反弹 汽车产业链全天强势
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 大小指数昨日集体反弹,沪指3100点失而复得,创业板指一度涨超1.5%,随后涨幅…...
【Python深度学习】深度学习入门介绍
引言 深度学习是人工智能领域中最受关注和研究的子领域之一,它在计算机视觉、自然语言处理、语音识别、推荐系统等各个领域都有广泛的应用。本文将详细介绍深度学习的发展历史、不同类型、应用领域以及未来发展前景。 1、深度学习的发展历史 深度学习的起源可以追溯…...

【Linux系统编程】进程概念与基本创建
文章目录 1. 进程的概念2. 进程描述—PCB3. task_struct—PCB的一种4. task_ struct内容分类5. 查看进程 这篇文章我们来学习下一个概念——进程 1. 进程的概念 那什么是进程呢,我们该如何理解它呢? 如果我们打开电脑的任务管理: 我们看到这…...
webpack:详解CopyWebpackPlugin,复制的同时修改文件内容
摘要 CopyWebpackPlugin 是一个强大的 Webpack 插件,用于将文件从源目录复制到构建目录。在本文中,我们将探讨 CopyWebpackPlugin 的一些常用 API,并提供示例代码。 在构建 Web 应用程序时,通常需要将一些静态文件(如…...

Twin-Builder—系统级多物理域数字孪生平台
Twin Builder是ANSYS公司系统仿真业务的核心产品,是一款跨学科多领域系统仿真软件和数字孪生平台。能够实现复杂系统的建模、仿真和验证,基于IIoT物联网平台对数字孪生体进行集成、部署与运行,在完成复杂系统功能、性能的验证和优化的同时&am…...

用selenium和xpath定位元素并获取属性值以及str字符型转json型
页面html如图所示: 要使用xpath定位这个div元素,并且获取其属性data-config的内容值。 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Optionshost127.0.0.1 port10808 …...

基于Java的电影院管理系统设计与实现
前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻…...

Linux Static Key原理与应用
文章目录 背景1. static-key的使用方法1.1. static-key定义1.2 初始化1.3 条件判断1.4 修改判断条件 2、示例代码参考链接 背景 内核中有很多判断条件在正常情况下的结果都是固定的,除非极其罕见的场景才会改变,通常单个的这种判断的代价很低可以忽略&a…...
linux ssh 禁止指定用户通过ssh登录
Linux 禁止用户或 IP通过 SSH 登录 限制用户 SSH 登录 1.只允许指定用户进行登录(白名单): 在 /etc/ssh/sshd_config 配置文件中设置 AllowUsers 选项,(配置完成需要重启 SSHD 服务)格式如下:…...

快速学习Netty
Netty框架探索:助力高效网络编程 一、Netty是个啥?二、“Hello World”服务器端实现(Server)客户端实现(Client)思考🤔 三、Netty的核心组件EventLoopChannelChannelPipelineChannelHandlerByte…...

对类和对象的详细解析
目录 1.类的构成 2.this指针 3.C类里面的静态成员 3.1 类里面的静态成员函数 3.2 类里面的静态成员变量 静态成员变量的特点 共享性 存储位置 生命周期 访问权限 如何初始化? 构造函数 1.类的构成 public修饰的成员在类外可以直接被访问 private和protecte…...

matlab 间接平差法拟合二维圆
目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。爬虫自重。 一、算法原理 圆的方程为: ( x - x 0 )...

pgzrun 拼图游戏制作过程详解(10)
10. 拼图游戏继续升级——多关卡拼图 初始化列表Photos用来储存拼图文件名,Photo_ID用来统计当下是第几张拼图,Squares储存当下拼图的24张小拼图的文件名,Gird储存当下窗口上显示的24个小拼图及坐标。 Photos["girl_","boy_…...
glog与pugi::xml使用方法
(一)glog的使用:google logging的简称; 1)需要安装,网上一搜一大堆,不在赘述; 2)在cmakelists.txt中,需要链接"-glog",如&a…...

windows下MySQL服务不见,服务无法启动,服务闪退,提示“本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止”
文章目录 前情提示1.解决MySQL服务消失2.解决MySQL服务无法启动 前情提示 后台启动MySQL服务出现闪退 或 “本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止”,可以参考以下方法。 我的电脑上安装了双版本MySQL,这里…...
剑指offer(C++)-JZ67:把字符串转换成整数atoi(算法-模拟)
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...