欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Jpa數(shù)據(jù)操作以及@Query和@Modifying注解使用方式

 更新時間:2024年07月17日 09:12:32   作者:hippoDocker  
這篇文章主要介紹了Jpa數(shù)據(jù)操作以及@Query和@Modifying注解使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

Jpa接口自定義sql注解@Query

@Query注解,使用注解有兩種方式:

  • 一種是JPQL的SQL語言方式
  • 一種是原生SQL的語言

略有區(qū)別,

代碼中具體區(qū)別是nativeQuery 屬性是否為true,我們一般使用的都是原生SQL的語言,需要加nativeQuery = true

1.不帶參數(shù)的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.一般帶參數(shù)簡單例子

 @Query(value = "select * from history where hdt.type=?1 ",nativeQuery = true)
    List<HistoryDesignTheme> findAllData(String type);

3.帶參@Param注解注入?yún)?shù)

@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注解只有對數(shù)據(jù)查詢的操作,如果你需要進行對數(shù)據(jù)的修改那就必須使用@Modifying注解。

JPA 在 EntityManager 中緩存了 find 生成的對象,而@Query 跟 find 和 save 系列方法是兩套不同的體系,@Query 引起的數(shù)據(jù)庫變更 EntityManager 并不能發(fā)現(xiàn),更進一步說,使用其它工具或者其它框架修改數(shù)據(jù)庫中的數(shù)據(jù),也不能及時反應到 JPA 的 find 系列方法上來。

解決方法就是:

  • 一是避免使用@Query并顯示清理EntityManager中的緩存,
  • 二是Spring Data JPA 提供了另外一種方式則是
@Modifying(clearAutomatically = true)

@Modifying 的 clearAutomatically 屬性為 true 時,執(zhí)行完 modifying query 之后就會清理緩存。

自動清理之后還會帶來一個新的問題,clear 操作清理的緩存中,還包括提交后未 flush 的數(shù)據(jù),

例如調(diào)用 save 而不是 saveAndFlush 就有可能不會立即將修改內(nèi)容更新到數(shù)據(jù)庫中,在 save 之后 flush 之前調(diào)用 @Modifying(clearAutomatically = true) 修飾的方法就有可能導致修改丟失。

如果再要解決這個問題,還可以再加上另外一個屬性

@Modifying(clearAutomatically = true, flushAutomatically = true)

@Modifying 的 flushAutomatically 屬性為 true 時,執(zhí)行 modifying query 之前會先調(diào)用 flush 操作,從而避免數(shù)據(jù)丟失問題。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

最新評論