Jpa數(shù)據(jù)操作以及@Query和@Modifying注解使用方式
Jpa接口自定義sql注解@Query
@Query注解,使用注解有兩種方式:
- 一種是JPQL的SQL語(yǔ)言方式
- 一種是原生SQL的語(yǔ)言
略有區(qū)別,
代碼中具體區(qū)別是nativeQuery 屬性是否為true,我們一般使用的都是原生SQL的語(yǔ)言,需要加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ù)簡(jiǎn)單例子
@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注解只有對(duì)數(shù)據(jù)查詢的操作,如果你需要進(jìn)行對(duì)數(shù)據(jù)的修改那就必須使用@Modifying注解。
JPA 在 EntityManager 中緩存了 find 生成的對(duì)象,而@Query 跟 find 和 save 系列方法是兩套不同的體系,@Query 引起的數(shù)據(jù)庫(kù)變更 EntityManager 并不能發(fā)現(xiàn),更進(jìn)一步說(shuō),使用其它工具或者其它框架修改數(shù)據(jù)庫(kù)中的數(shù)據(jù),也不能及時(shí)反應(yīng)到 JPA 的 find 系列方法上來(lái)。
解決方法就是:
- 一是避免使用@Query并顯示清理EntityManager中的緩存,
- 二是Spring Data JPA 提供了另外一種方式則是
@Modifying(clearAutomatically = true)
@Modifying 的 clearAutomatically 屬性為 true 時(shí),執(zhí)行完 modifying query 之后就會(huì)清理緩存。
自動(dòng)清理之后還會(huì)帶來(lái)一個(gè)新的問(wèn)題,clear 操作清理的緩存中,還包括提交后未 flush 的數(shù)據(jù),
例如調(diào)用 save 而不是 saveAndFlush 就有可能不會(huì)立即將修改內(nèi)容更新到數(shù)據(jù)庫(kù)中,在 save 之后 flush 之前調(diào)用 @Modifying(clearAutomatically = true) 修飾的方法就有可能導(dǎo)致修改丟失。
如果再要解決這個(gè)問(wèn)題,還可以再加上另外一個(gè)屬性
@Modifying(clearAutomatically = true, flushAutomatically = true)
@Modifying 的 flushAutomatically 屬性為 true 時(shí),執(zhí)行 modifying query 之前會(huì)先調(diào)用 flush 操作,從而避免數(shù)據(jù)丟失問(wèn)題。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java Fluent Mybatis 聚合查詢與apply方法詳解流程篇
Java中常用的ORM框架主要是mybatis, hibernate, JPA等框架。國(guó)內(nèi)又以Mybatis用的多,基于mybatis上的增強(qiáng)框架,又有mybatis plus和TK mybatis等。今天我們介紹一個(gè)新的mybatis增強(qiáng)框架 fluent mybatis關(guān)于聚合查詢、apply方法詳解2021-10-10
java實(shí)戰(zhàn)技巧之if-else代碼優(yōu)化技巧大全
代碼中如果if-else比較多,閱讀起來(lái)比較困難,維護(hù)起來(lái)也比較困難,很容易出bug,下面這篇文章主要給大家介紹了關(guān)于java實(shí)戰(zhàn)技巧之if-else代碼優(yōu)化技巧的相關(guān)資料,需要的朋友可以參考下2022-02-02
SpringBoot實(shí)現(xiàn)輕量級(jí)動(dòng)態(tài)定時(shí)任務(wù)管控及組件化的操作步驟
文章介紹了一種在SpringBoot中實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)的解決方案,基于COLA架構(gòu)理論,封裝到了組件層,該組件支持類級(jí)別和方法級(jí)別的定時(shí)任務(wù)注冊(cè),并提供了易用性和擴(kuò)展性,組件使用Maven形式引入,并且可以通過(guò)YAML配置文件進(jìn)行設(shè)置,感興趣的朋友一起看看吧2024-11-11
使用sts工具、SpringBoot整合mybatis的詳細(xì)步驟
這篇文章主要介紹了使用sts工具、SpringBoot整合mybatis的詳細(xì)步驟,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
Springboot?+redis+谷歌開(kāi)源Kaptcha實(shí)現(xiàn)圖片驗(yàn)證碼功能
這篇文章主要介紹了Springboot?+redis+?歌開(kāi)源Kaptcha實(shí)現(xiàn)圖片驗(yàn)證碼功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01
Java堆&優(yōu)先級(jí)隊(duì)列示例講解(上)
這篇文章主要通過(guò)示例詳細(xì)為大家介紹Java中的堆以及優(yōu)先級(jí)隊(duì)列,文中的示例代碼講解詳細(xì),對(duì)我們了解java有一定幫助,需要的可以參考一下2022-03-03
springboot新建項(xiàng)目jdk只有17/21,無(wú)法選中1.8解決辦法
最近博主也有創(chuàng)建springboot項(xiàng)目,發(fā)現(xiàn)了IntelliJ IDEA在通過(guò)Spring Initilizer初始化項(xiàng)目的時(shí)候已經(jīng)沒(méi)有java8版本的選項(xiàng)了,這里給大家總結(jié)下,這篇文章主要給大家介紹了springboot新建項(xiàng)目jdk只有17/21,無(wú)法選中1.8的解決辦法,需要的朋友可以參考下2023-12-12
詳解SpringBoot?統(tǒng)一后端返回格式的方法
今天我們來(lái)聊一聊在基于SpringBoot前后端分離開(kāi)發(fā)模式下,如何友好的返回統(tǒng)一的標(biāo)準(zhǔn)格式以及如何優(yōu)雅的處理全局異常,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2022-05-05

