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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
獲取系統(tǒng)參數(shù)System.getProperties()與配置文件參數(shù)@Value(“${key}“)
這篇文章主要介紹了獲取系統(tǒng)參數(shù)System.getProperties()與配置文件參數(shù)@Value("${key}"),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05Springboot maven plugin插件原理及作用
這篇文章主要介紹了Springboot maven plugin插件原理及作用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-10-10springboot動態(tài)定時任務的實現(xiàn)方法示例
這篇文章主要給大家介紹了關于springboot動態(tài)定時任務的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02SSH框架網(wǎng)上商城項目第7戰(zhàn)之整合Struts2和Json
SSH框架網(wǎng)上商城項目第7戰(zhàn)之整合Struts2和Json,打通EasyUI和Struts2之間的交互,感興趣的小伙伴們可以參考一下2016-05-05RocketMQ NameServer保障數(shù)據(jù)一致性實現(xiàn)方法講解
這篇文章主要介紹了RocketMQ NameServer保障數(shù)據(jù)一致性實現(xiàn)方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12SpringBoot啟動失敗的解決方法:A component required a&nb
這篇文章主要介紹了解決SpringBoot啟動失?。篈 component required a bean of type ‘xxxxxxx‘ that could not be found.,目前解決方法有兩種,一種是不注入bean的方式,另一種是使用@Component的方式,本文給大家詳細講解,需要的朋友可以參考下2023-02-02