SpringData @Query和@Modifying注解原理解析
@Query注解查詢(xún)適用于所查詢(xún)的數(shù)據(jù)無(wú)法通過(guò)關(guān)鍵字查詢(xún)得到結(jié)果的查詢(xún)。這種查詢(xún)可以擺脫像關(guān)鍵字查詢(xún)那樣的約束,將查詢(xún)直接在相應(yīng)的接口方法中聲明,結(jié)構(gòu)更為清晰,這是Spring Data的特有實(shí)現(xiàn)。
索引參數(shù)與命名參數(shù)
1、索引參數(shù)如下所示,索引值從1開(kāi)始,查詢(xún)中"?X"個(gè)數(shù)需要與方法定義的參數(shù)個(gè)數(shù)相一致,并且順序也要一致?! ?/p>
@Query("SELECT p FROM Person p WHERE p.lastName = ?1 AND p.email = ?2")
List<Person> testQueryAnnotationParams1(String lastName, String email);
注釋?zhuān)荷厦娲a中的?1,?2表示參數(shù)的占位符,需要和方法中所傳遞的參數(shù)順序一致。X是從1開(kāi)始。
2、命名參數(shù)(推薦使用此方式):可以定義好參數(shù)名,賦值時(shí)使用@Param("參數(shù)名"),而不用管順序。
// 為@Query注解傳遞參數(shù)的方式1:命名參數(shù)
@Query("SELECT p FROM Person p WHERE p.lastName = :lastName AND p.email = :email")
List<Person> testQueryAnnotationParams2(@Param("email") String email, @Param("lastName") String lastName);
注釋?zhuān)荷厦娲a中:lastName ,:email 表示為參數(shù)命名,方法中所傳遞的參數(shù)使用@Param注解標(biāo)識(shí)命名參數(shù)。這種方式不用管參數(shù)的順序。
3、含有LIKE關(guān)鍵字的查詢(xún)
方式1:可以在占位符上添加"%",這樣在查詢(xún)方法中就不用添加"%"
// like查詢(xún) Spring Date 允許在占位符上添加%
@Query("SELECT p FROM Person p WHERE p.lastName LIKE %?1% OR p.email LIKE %?2%")
List<Person> testQueryAnnotationLikeParam(String lastName, String email);
@Test
public void testAnnoationParams3() {
List<Person> persons = personRepsitory.testQueryAnnotationLikeParam("A", "A@126.com");
System.out.println(persons);
}
方式2:不在占位符上添加"%",這樣就必須在查詢(xún)方法的參數(shù)上添加"%"
// like查詢(xún)
@Query("SELECT p FROM Person p WHERE p.lastName LIKE ?1 OR p.email LIKE ?2")
List<Person> testQueryAnnotationLikeParam2(String lastName, String email);
@Test
public void testAnnoationParams4() {
List<Person> persons = personRepsitory.testQueryAnnotationLikeParam2("%A%", "%A@126.com%");
System.out.println(persons);
}
方式3:在命名參數(shù)上添加"%"
// like查詢(xún) 使用命名參數(shù)
@Query("SELECT p FROM Person p WHERE p.lastName LIKE %:lastName% OR p.email LIKE %:email%")
List<Person> testQueryAnnotationLikeParam3(@Param("email") String email, @Param("lastName") String lastName);
4、使用原生SQL進(jìn)行查詢(xún)
** * 設(shè)置nativeQuery=true 即可以使用原生的SQL進(jìn)行查詢(xún) * @return */ @Query(value = "SELECT count(id) FROM jpa_persons", nativeQuery = true) long getTotalCount();
注釋?zhuān)寒?dāng)設(shè)置nativeQuery=true即可以使用原生SQL進(jìn)行查詢(xún)
@Modifying注解
1、在@Query注解中編寫(xiě)JPQL實(shí)現(xiàn)DELETE和UPDATE操作的時(shí)候必須加上@modifying注解,以通知Spring Data 這是一個(gè)DELETE或UPDATE操作。
2、UPDATE或者DELETE操作需要使用事務(wù),此時(shí)需要 定義Service層,在Service層的方法上添加事務(wù)操作。
3、注意JPQL不支持INSERT操作?! ?/p>
@Transactional
@Modifying
@Query("UPDATE Person p SET p.email = :email WHERE p.id = :id")
void updatePersonEmail(@Param("id") Integer id, @Param("email") String email);
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)查找當(dāng)前字符串最大回文串代碼分享
本文給大家介紹的是如何使用Java實(shí)現(xiàn)查找當(dāng)前字符串最大回文串代碼,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下2016-07-07
java Spring MVC4環(huán)境搭建實(shí)例詳解(步驟)
spring WEB MVC框架提供了一個(gè)MVC(model-view-controller)模型-視圖-控制器的結(jié)構(gòu)和組件,利用它可以開(kāi)發(fā)更靈活、松耦合的web應(yīng)用。MVC模式使得整個(gè)服務(wù)應(yīng)用的各部分(控制邏輯、業(yè)務(wù)邏輯、UI界面展示)分離開(kāi)來(lái),使它們之間的耦合性更低2017-08-08
JAVA中跳出當(dāng)前多重嵌套循環(huán)的方法詳解
今天在看面試題時(shí),發(fā)現(xiàn)了這個(gè)問(wèn)題,因?yàn)樵赑HP中跳出多次循環(huán)可以使用break數(shù)字來(lái)跳出多層循環(huán),但這在java中并不好使,這篇文章主要給大家介紹了關(guān)于JAVA中跳出當(dāng)前多重嵌套循環(huán)的相關(guān)資料,需要的朋友可以參考下2022-01-01
java中實(shí)現(xiàn)創(chuàng)建目錄與創(chuàng)建文件的操作實(shí)例
用Java創(chuàng)建文件或目錄非常簡(jiǎn)單,下面這篇文章主要給大家介紹了關(guān)于java中實(shí)現(xiàn)創(chuàng)建目錄與創(chuàng)建文件的操作實(shí)例,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01
Spring AOP如何整合redis(注解方式)實(shí)現(xiàn)緩存統(tǒng)一管理詳解
這篇文章主要給大家介紹了關(guān)于Spring AOP如何整合redis(注解方式)實(shí)現(xiàn)緩存統(tǒng)一管理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08
淺談javaSE 面向?qū)ο?Object類(lèi)toString)
下面小編就為大家?guī)?lái)一篇淺談javaSE 面向?qū)ο?Object類(lèi)toString)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06

