Spring Data Jpa (四)註解式查詢方法

詳細講解聲明式的查詢方法數據庫

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語句,而非實體的字段名字

相關文章
相關標籤/搜索