詳細講解聲明式的查詢方法數據庫
1 @Query詳解express
使用命名查詢爲實體聲明查詢是一種有效的方法,對於少許查詢頗有效。通常只須要關心@Query裏面的value和nativeQuery的值。使用聲明式JPQL查詢有一個好處,就是啓動的時候就知道語法正確與否。函數
聲明一個註解在Repository的查詢方法上。3d
Like查詢,注意firstname不會自動加上%關鍵字的對象
直接用原始SQL。blog
nativeQuery不支持直接Sort的參數查詢排序
錯誤方式:接口
正確方式:源碼
2.@Query排序it
@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語句,而非實體的字段名字