总结下SpringData JPA 的常用语法

SpringData JPA常用有两种写法,一个是用Jpa自带方法进行CRUD,适合简单查询场景、例如查询全部数据、根据某个字段查询,根据某字段排序等等。另一种是使用注解方式,@Query、@Modifying。

1.方法方式

方法说明

接口方法如下,方法作用见注释:

public interface JpaRepository extends PagingAndSortingRepository, QueryByExampleExecutor { // 无条件,查询全部记录 List findAll(); // 排序查询 List findAll(Sort var1); // 根据主键ID查询 List findAllById(Iterable var1); // 批量保存集合数据 List saveAll(Iterable var1); void flush(); S saveAndFlush(S var1); // 批量删除 void deleteInBatch(Iterable var1); // all in 全部删除 void deleteAllInBatch(); // 查询一条记录 T getOne(ID var1); // 条件查询 List findAll(Example var1); // 条件查询,带排序 List findAll(Example var1, Sort var2);}复制代码

例子

一般dao实现JpaRepository接口,直接调用JpaRepository中的方法就可以实现了简单查询,例如查询User实例列表:

// 构建user的Example对象Example example =Example.of(User);List 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@Documentedpublic @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 queryByGroup();复制代码

  • 使用注解方式排序

根据task_id进行排序查询task集合

@Query(value = “select task_id,task_date from task order by task_id”, nativeQuery = true)List 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 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的含义是代表传入的参数如果不为””(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 =:startDate,1=1)” + ” AND if(:endDate!=”,a.task_date <=:endDate,1=1)" + " order by a.task_date desc")Page 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

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年6月18日
下一篇 2022年6月18日

相关推荐

  • 不敢素颜面对世人 现代怀古职业化妆师们的愤怒与无奈

    现代社会的发展,生活的富裕,让女性化妆,成为了非常重要的生活内容。对很多女性来说,不化妆,毋宁死,不然宁可不出门。 本来,二十年前,化妆,还只是部分年轻女性的生活内容。不过,化妆打…

    2022年7月3日
  • springboot、mybatis-plus、Druid多数据源环境搭建

    简述 Java单体项目里,我们一般是只需配置一个数据库,这时代码里的dao层都是只对一个数据库操作;但有时候我们的数据可能在2个或者3个数据库,这时就需要配置更多数据源,进行数据库…

    2022年6月21日
  • 夸人常用句子,听了让人特别舒服

    1.为具体的事情而夸 我很喜欢你。。。这一点. 这个主意真不错. 你真是妈妈/爸爸的好帮手. 2. 夸天赋、夸技能 你很有才华. 你的梦想很棒. 你的理解力很高. 你很聪明. 你很…

    2022年5月14日
  • 再次关注网络安全-这只风口猪

    详细内容不说了,前几期都简单粗暴的说了一下个人见解,今天直接上干货 [呲牙]

    2022年6月25日
  • 介绍网站推广判断友链降权的3种方法(网站推广判断友链降权的方法有哪些)

    网站推广的有效方法有两种,即对内做网站优化,对外做外链建设,建设外链的一个重要组成部分就是友链,选择友链的时候,注意事项有很多,也不要今天与别人交换明天就删除了,这种做法对谁都不好…

    2022年10月22日
  • win7字体显示不正常解决步骤

    很多用户电脑上安装新软件后可能由于使用的系统语言不当导致出现乱码的现象,下面给大家介绍win7字体显示不正常解决步骤。 1、使用win+r快捷键打开窗口,输入“control”命令…

    2022年6月27日
  • Javascript ES6中 Generator的?async/await Promise 了解一下?

    介绍 Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同 生成器对象是由一个 generator function 返回的,并且它符合可迭代…

    2022年6月27日
  • 人类目前不可能研究出真正的人工智能

    我是工作10年多的程序员,对目前研究的人工智能也有所了解。我可以断言,按照目前数据统计模拟+概率分析的方式,人类永远不可能研究出 拥有智慧的系统。 所以,也不可能会出现 未来机器人…

    2022年7月9日
  • 王迅的妻子王依梓:本以为打败原配就能做正宫,没想到活成了笑话

    文丨柠一 编辑丨娱阿姨 王迅是一位演员。 但他最出名的作品应该是综艺《极限挑战》。 在此之前,他已经跑了十多年的龙套。 一朝成名后,王迅做的第一件事,就是和发妻魏臻离婚。 当时,魏…

    2022年7月27日
  • 人民日报教你:9个方法走出负面情绪,拒绝emo

    你是不是也时常莫名就觉得情绪低落,什么都提不起精神?是否总是习惯自我否定?看到别人都似乎过得很好很幸福,只有自己的生活是一地鸡毛?……没有人能时时刻刻保持积极向上,是人就会有情绪的…

    2022年4月30日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息