Jpa数据操作以及@Query和@Modifying注解使用方式
Jpa接口自定义sql注解@Query
@Query注解,使用注解有两种方式:
- 一种是JPQL的SQL语言方式
- 一种是原生SQL的语言
略有区别,
代码中具体区别是nativeQuery 属性是否为true,我们一般使用的都是原生SQL的语言,需要加nativeQuery = true
1.不带参数的sql
@Query(value = "select count(1) code,hdt.type data from history_design_theme hdt where 1=1 GROUP BY hdt.type",nativeQuery = true)
List<DataCodeDTO> findHistoryType();2.一般带参数简单例子
@Query(value = "select * from history where hdt.type=?1 ",nativeQuery = true)
List<HistoryDesignTheme> findAllData(String type);3.带参@Param注解注入参数
@Query(value = "select * from sys_role sr where sr.role_id in(:idList) and sr.state=:state ",nativeQuery = true)
List<SysRole> findAllByRoleIdInAndState(@Param(value = "idList") List<Long> idList, @Param(value = "state") Long state);4.@Modifying注解
@Query注解只有对数据查询的操作,如果你需要进行对数据的修改那就必须使用@Modifying注解。
JPA 在 EntityManager 中缓存了 find 生成的对象,而@Query 跟 find 和 save 系列方法是两套不同的体系,@Query 引起的数据库变更 EntityManager 并不能发现,更进一步说,使用其它工具或者其它框架修改数据库中的数据,也不能及时反应到 JPA 的 find 系列方法上来。
解决方法就是:
- 一是避免使用@Query并显示清理EntityManager中的缓存,
- 二是Spring Data JPA 提供了另外一种方式则是
@Modifying(clearAutomatically = true)
@Modifying 的 clearAutomatically 属性为 true 时,执行完 modifying query 之后就会清理缓存。
自动清理之后还会带来一个新的问题,clear 操作清理的缓存中,还包括提交后未 flush 的数据,
例如调用 save 而不是 saveAndFlush 就有可能不会立即将修改内容更新到数据库中,在 save 之后 flush 之前调用 @Modifying(clearAutomatically = true) 修饰的方法就有可能导致修改丢失。
如果再要解决这个问题,还可以再加上另外一个属性
@Modifying(clearAutomatically = true, flushAutomatically = true)
@Modifying 的 flushAutomatically 属性为 true 时,执行 modifying query 之前会先调用 flush 操作,从而避免数据丢失问题。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Java Fluent Mybatis 聚合查询与apply方法详解流程篇
Java中常用的ORM框架主要是mybatis, hibernate, JPA等框架。国内又以Mybatis用的多,基于mybatis上的增强框架,又有mybatis plus和TK mybatis等。今天我们介绍一个新的mybatis增强框架 fluent mybatis关于聚合查询、apply方法详解2021-10-10
SpringBoot实现轻量级动态定时任务管控及组件化的操作步骤
文章介绍了一种在SpringBoot中实现动态定时任务的解决方案,基于COLA架构理论,封装到了组件层,该组件支持类级别和方法级别的定时任务注册,并提供了易用性和扩展性,组件使用Maven形式引入,并且可以通过YAML配置文件进行设置,感兴趣的朋友一起看看吧2024-11-11
使用sts工具、SpringBoot整合mybatis的详细步骤
这篇文章主要介绍了使用sts工具、SpringBoot整合mybatis的详细步骤,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-04-04
Springboot +redis+谷歌开源Kaptcha实现图片验证码功能
这篇文章主要介绍了Springboot +redis+⾕歌开源Kaptcha实现图片验证码功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-01-01
springboot新建项目jdk只有17/21,无法选中1.8解决办法
最近博主也有创建springboot项目,发现了IntelliJ IDEA在通过Spring Initilizer初始化项目的时候已经没有java8版本的选项了,这里给大家总结下,这篇文章主要给大家介绍了springboot新建项目jdk只有17/21,无法选中1.8的解决办法,需要的朋友可以参考下2023-12-12


最新评论