詳細講解聲明式的查詢方法
1 @Query詳解
使用命名查詢為實體聲明查詢是一種有效的方法,對於少量查詢很有效。一般只需要關心@Query里面的value和nativeQuery的值。使用聲明式JPQL查詢有一個好處,就是啟動的時候就知道語法正確與否。
聲明一個注解在Repository的查詢方法上。
Like查詢,注意firstname不會自動加上%關鍵字的
直接用原始SQL。
nativeQuery不支持直接Sort的參數查詢
錯誤方式:
正確方式:
2.@Query排序
@Query在JPQL下想實現排序,直接用PageRequest或者直接用Sort參數都可以。
在排序實例中實際使用的屬性需要與實體模型里面的字段相匹配,這意味着它們需要解析為查詢中使用的屬性或別名。這是一個state_field_path_expression JPQL定義,並且Sort的對象支持一些特定的函數。
3.@Query分頁
直接用Page對象接收接口,參數直接用Pageable的實現類即可。
2.@Param用法
默認情況下,參數是通過順序綁定在查詢語句上的。這使得查詢方法對參數位置的重構容易出錯。為了解決這個問題,你可以使用@Param注解指定方法參數的具體名稱,通過綁定的參數名字做查詢條件。
根據參數進行查詢。
3.SpEL表達式的支持
在Spring Data JPA 1.4以后,支持在@Query中使用SpEL表達式(簡介)來接收變量。
SpEL支持的變量如表4-1所示
在以下的例子中,我們在查詢語句中插入表達式:
這個SpEL的支持比較適合自定義的Repository,如果想寫一個通用的Repository接口,那么可以用這個表達式來處理:
4. @Modifying修改查詢
可以通過在@Modifying注解實現只需要參數綁定的update查詢執行:
簡單地針對某些特定屬性的更新也可以直接用基類里面提供的通用save。還有第三種方法,就是自定義Repository,使用EntityManager來進行更新操作。用法如下:
5 @QueryHints
有很多數據庫支持Hint Query的語法,不過這種查詢支持比較老舊,感覺應該會慢慢被淘汰,工作中很少有人使用。Spring Data JPA還是做了很好的支持,它只支持一些固定的HintValue值,用來優化Query的作用。有兩個注解需要了解和知道一下@QueryHints,value等於多個@QueryHint。
用法如下:
6 @Procedure儲存過程的查詢方法
我們通過@Procedure來介紹一下JPA對儲存過程的支持
(1)@Procedure源碼如下:
(2)首先創建一個儲存過程名字plus1inout,有兩個參數、兩個結果。
(3)使用@NamedStoredProcedureQueries注釋來調用存儲過程。這個必須定義在一個實體上面。
關鍵要點:
存儲過程使用了注釋@NamedStoredProcedureQuery,並綁定到一個JPA表。
procedureName是存儲過程的名字。
name是JPA中存儲過程的名字。
使用注釋@StoredProcedureParameter來定義存儲過程使用的IN/OUT參數。
(4)直接通過自定義過的Repository完成儲存過程的調用。
關鍵要點:
@Procedure的procedureName參數必須匹配
@NamedStoredProcedureQuery的procedureName。
@Procedure的name參數必須匹配@NamedStoredProcedureQuery的name。
@Param必須匹配@StoredProcedureParameter注釋的name參數。
返回類型必須匹配:in_only_test存儲過程返回是void,in_and_out_test存儲過程必須返回String
7 @NamedQueries預定義查詢
在@Entity下增加@NamedQuery定義
需要注意,query里面的值也是JPQL。查詢參數也要和實體對應起來。因為實際場景中這種破壞Entity的侵入式很不美,也不方便,所以這種方式容易遺忘,工作中也很少推薦。
與之相對應的還有@NamedNativeQuery。用法一樣,唯一不一樣的是,query里面放置的是原生SQL語句,而非實體的字段名字