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 操作,从而避免数据丢失问题。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
获取系统参数System.getProperties()与配置文件参数@Value(“${key}“)
这篇文章主要介绍了获取系统参数System.getProperties()与配置文件参数@Value("${key}"),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-05-05
Springboot maven plugin插件原理及作用
这篇文章主要介绍了Springboot maven plugin插件原理及作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2020-10-10
RocketMQ NameServer保障数据一致性实现方法讲解
这篇文章主要介绍了RocketMQ NameServer保障数据一致性实现方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-12-12
SpringBoot启动失败的解决方法:A component required a&nb
这篇文章主要介绍了解决SpringBoot启动失败:A component required a bean of type ‘xxxxxxx‘ that could not be found.,目前解决方法有两种,一种是不注入bean的方式,另一种是使用@Component的方式,本文给大家详细讲解,需要的朋友可以参考下2023-02-02


最新评论