Jpa数据操作以及@Query和@Modifying注解使用方式
作者:hippoDocker
这篇文章主要介绍了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 操作,从而避免数据丢失问题。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。