java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Jpa数据及@Query和@Modifying注解使用

Jpa数据操作以及@Query和@Modifying注解使用方式

作者:hippoDocker

这篇文章主要介绍了Jpa数据操作以及@Query和@Modifying注解使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Jpa接口自定义sql注解@Query

@Query注解,使用注解有两种方式:

略有区别,

代码中具体区别是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 系列方法上来。

解决方法就是:

@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 操作,从而避免数据丢失问题。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文