总结下SpringData JPA 的常用语法
liuian 2025-08-06 21:06 50 浏览
SpringData JPA常用有两种写法,一个是用Jpa自带方法进行CRUD,适合简单查询场景、例如查询全部数据、根据某个字段查询,根据某字段排序等等。另一种是使用注解方式,@Query、@Modifying。
1.方法方式
方法说明
接口方法如下,方法作用见注释:
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
// 无条件,查询全部记录
List<T> findAll();
// 排序查询
List<T> findAll(Sort var1);
// 根据主键ID查询
List<T> findAllById(Iterable<ID> var1);
// 批量保存集合数据
<S extends T> List<S> saveAll(Iterable<S> var1);
void flush();
<S extends T> S saveAndFlush(S var1);
// 批量删除
void deleteInBatch(Iterable<T> var1);
// all in 全部删除
void deleteAllInBatch();
// 查询一条记录
T getOne(ID var1);
// 条件查询
<S extends T> List<S> findAll(Example<S> var1);
// 条件查询,带排序
<S extends T> List<S> findAll(Example<S> var1, Sort var2);
}
复制代码例子
一般dao实现JpaRepository接口,直接调用JpaRepository中的方法就可以实现了简单查询,例如查询User实例列表:
// 构建user的Example对象
Example<User> example =Example.of(User);
List<User> users = userRepository.findAll(example);
复制代码2.注解方式
jpa实现CRUD的主要注解是@Query
注解说明
@Query注解主要有以下参数,参数作用如下:
- value:SQL语句
- countQuery: 分页查询时统计总数
- nativeQuery: 使用执行这个方法的时候执行原生sql语句,直接写数据库中的实际表名和表的实际字段名
@Query的代码如下:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@QueryAnnotation
@Documented
public @interface Query {
String value() default "";
String countQuery() default "";
String countProjection() default "";
boolean nativeQuery() default false;
String name() default "";
String countName() default "";
}
复制代码例子
- 使用注解方式分组查询
跟正常写sql语句相同,将sql写到value中,并且nativeQuery = true。下面例子是根据task_id进行分组查询task集合
@Query(value = "select task_id from task group by task_id", nativeQuery = true)
List<Task> queryByGroup();
复制代码- 使用注解方式排序
根据task_id进行排序查询task集合
@Query(value = "select task_id,task_date from task order by task_id", nativeQuery = true)
List<Task> queryOrder();
复制代码- 使用注解方式条件查询
条件查询时可以使用字段名 操作符 ?;例如:task_date >= ?,使用位置匹配?。也可以使用字段名 操作符 :属性名;例如:task_date >= :startDate,使用属性名匹配,推荐使用后者,如果字段顺序修改,不影响匹配结果。下面是根据任务时间(task_date)段内和未被删除(deleted)的任务
@Query(value = "select task_id,task_date from task where task_date >=? and task_date <=? and deleted=0 ", nativeQuery = true)
List<ApptTask> queryDate(@Param("startDate") String startDate, @Param("endDate") String endDate);
复制代码- 使用注解方式修改
修改一条数据需要加上@Modifying用于标识是修改操作,默认事务等级是只读,所以还需要加上@Transactional,这样覆盖了默认的@Transactional才可以执行修改操作。下面是根据task_id更新task表的备注信息
@Transactional(rollbackOn = Exception.class)
@Modifying
@Query(value = "update task set remark = ? where task_id=?", nativeQuery = true)
void updateRemark(@Param("remark") String remark, @Param("taskId") String taskId);
复制代码多表联查,且多条件、分页查询怎么写?
复杂的查询需要注意,以下使用一个Mysql的多表联查的例子来说明复杂的查询要怎么写。下面是user表task表关联查询出任务名称、任务ID、用户名称这些信息,并且根据task_name、task_date进行过滤;根据task_date倒序。
共有几点需要注意:
- 多表联查使用正常的JOIN就可以
- 多条件是常见的情况,需要区别传入的条件是否要去执行,这种情况需要使用where 1=1 and 这种方式来保证条件不传时仍然正常查询。
- 分页查询需要传入分页参数Pageable,并且写countQuery来统计总数。
- 多条件查询关键:if(:参数!='',k.字段名 =:参数,1=1),这里是使用了if进行判断,这个写法类似Mybatis xml中的<if>标签。if的含义是代表传入的参数如果不为""(Spring类型空是""而不是null)将参数传入,如果为空时显示1=1 代表参数为真,对查询结果不产生作用。
代码:
@Query(value =
" select a.task_name, a.task_id,u.user_name" +
" from task a " +
" LEFT JOIN usert u" +
" ON a.user_id = u.user_id" +
" where a.deleted=0 " +
" AND if(:taskName!='',a.task_name =:taskName,1=1)" +
" AND if(:startDate!='',a.task_date >=:startDate,1=1)" +
" AND if(:endDate!='',a.task_date <=:endDate,1=1)" +
" order by a.task_date desc"
,
nativeQuery = true
,
countQuery =
" select count(*)" +
" from task a " +
" LEFT JOIN usert u" +
" ON a.user_id = u.user_id" +
" where a.deleted=0 " +
" AND if(:taskName!='',a.task_name =:taskName,1=1)" +
" AND if(:startDate!='',a.task_date >=:startDate,1=1)" +
" AND if(:endDate!='',a.task_date <=:endDate,1=1)" +
" order by a.task_date desc")
Page<Map<String,Object>> queryUserTaskPage(@Param("taskName") String taskName, @Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate, @Param("pageable") Pageable pageable);
复制代码小结
以上列举了两种JPA的crud方式,jpa方法与注解方式,平时写代码时更倾向于使用注解方式去写原生sql来实现业务。对于简单查询可以用JpaRepository里面这些方法就够用了,对于更复杂的场景推荐使用@Query写sql的方式来实现。
jpa方法可以屏蔽底层的sql,如果有不同数据库实现的服务,用jpa方法可以免于修改sql。但是jpa方法对于分组查询、limit支持、多条件、多表联查这些不太友好。
小伙伴们有兴趣想了解内容和更多相关学习资料的请点赞收藏+评论转发+关注我,后面会有很多干货。我有一些面试题、架构、设计类资料可以说是程序员面试必备!所有资料都整理到网盘了,需要的话欢迎下载!私信我回复【666】即可免费获取
.
作者:斗笠小熊猫
原文出处:
https://juejin.cn/post/7106487853126778910
相关推荐
- 搭建一个20人的办公网络(适用于20多人的小型办公网络环境)
-
楼主有5台机上网,则需要一个8口路由器,组网方法如下:设备:1、8口路由器一台,其中8口为LAN(局域网)端口,一个WAN(广域网)端口,价格100--400元2、网线N米,这个你自己会看了:)...
- 笔记本电脑各种参数介绍(笔记本电脑各项参数新手普及知识)
-
1、CPU:这个主要取决于频率和二级缓存,频率越高、二级缓存越大,速度越快,现在的CPU有三级缓存、四级缓存等,都影响相应速度。2、内存:内存的存取速度取决于接口、颗粒数量多少与储存大小,一般来说,内...
- 汉字上面带拼音输入法下载(字上面带拼音的输入法是哪个)
-
使用手机上的拼音输入法打成汉字的方法如下:1.打开手机上的拼音输入法,在输入框中输入汉字的拼音,例如“nihao”。2.根据输入法提示的候选词,选择正确的汉字。例如,如果输入“nihao”,输...
- xpsp3安装版系统下载(windowsxpsp3安装教程)
-
xpsp3纯净版在采用微软封装部署技术的基础上,结合作者的实际工作经验,融合了许多实用的功能。它通过一键分区、一键装系统、自动装驱动、一键设定分辨率,一键填IP,一键Ghost备份(恢复)等一系列...
- 没有备份的手机数据怎么恢复
-
手机没有备份恢复数据方法如下1、使用数据线将手机与电脑连接好,在“我的电脑”中可以看到手机的盘符。 2、将手机开启USB调试模式。在手机设置中找到开发者选项,然后点击“开启USB调试模式”。 3、...
- 电脑怎么激活windows11专业版
-
win11专业版激活方法有多种,以下提供两种常用的激活方式:方法一:使用激活密钥激活。在win11桌面上右键点击“此电脑”,选择“属性”选项。进入属性页面后,点击“更改产品密钥或升级windows”。...
- 华为手机助手下载官网(华为手机助手app下载专区)
-
华为手机助手策略调整,已不支持从应用市场下载手机助手,目前华为手机助手是需要在电脑上下载或更新手机助手到最新版本,https://consumer.huawei.com/cn/support/his...
- 光纤线断了怎么接(宽带光纤线断了怎么接)
-
宽带光纤线断了可以重接,具体操作方法如下:1、光纤连接的时候要根据束管内,同色相连,同芯相连,按顺序进行连接,由大到小。一般有三种连接方法,分别是熔接、活动连接和机械连接。2、连接的时候要开剥光缆,抛...
- win7旗舰版和专业版区别(win7旗舰版跟专业版)
-
1、功能区别:Win7旗舰版比专业版多了三个功能,分别是Bitlocker、BitlockerToGo和多语言界面; 2、用途区别:旗舰版的功能是所有版本中最全最强大的,占用的系统资源,...
- 万能连接钥匙(万能wifi连接钥匙下载)
-
1、首先打开wifi万能钥匙软件,若手机没有开启WLAN,就根据软件提示打开WLAN开关;2、打开WLAN开关后,会显示附近的WiFi,如果知道密码,可点击相应WiFi后点击‘输入密码’连接;3、若不...
- 雨林木风音乐叫什么(雨林木风是啥)
-
雨林木风的创始人是陈年鑫先生。陈年鑫先生于1999年创立了雨林木风公司,其初衷是为满足中国市场对高品质、高性能电脑的需求。在陈年鑫先生的领导下,雨林木风以技术创新、产品质量和客户服务为核心价值,不断推...
- aics6序列号永久序列号(aics6破解序列号)
-
关于AICS6这个版本,虽然是比较久远的版本,但是在功能上也是十分全面和强大的,作为一名平面设计师的话,AICS6的现有的功能已经能够应付几乎所有的设计工作了……到底AICC2019的功能是不是...
- 手机可以装电脑系统吗(手机可以装电脑系统吗怎么装)
-
答题公式1:手机可以通过数据线或无线连接的方式给电脑装系统。手机安装系统需要一定的技巧和软件支持,一般需要通过数据线或无线连接的方式与电脑连接,并下载相应的软件和系统文件进行安装。对于大部分手机用户来...
- 一周热门
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
