詳細メソッド宣言型のクエリで説明
詳細1 @query
クエリの名前を使用するエンティティは、それがクエリの少量のために有効であり、クエリステートメントが有効な方法です。一般的にのみnativeQueryの内部値と@queryの値を心配する必要があります。JPQL宣言型クエリは、彼が文法的に正しいかどうかを知っていたときに開始するという利点を有します。
クエリメソッドリポジトリにコメントを宣言します。
クエリと同様に、ノートFIRSTNAMEは、自動的にキーワード%追加しないのを
オリジナルのSQLを直接使用します。
nativeQueryは直接ソートのパラメータクエリをサポートしていません。
間違った方法:
正しい方法:
2. @クエリの並べ替え
することができPageRequestパラメータによって直接、または直接ソート、JPQLでソート達成したい@query。
ソリッドモデルは、彼らがクエリのプロパティまたはエイリアスを解決する必要があることを意味フィールドを、一致するのプロパティの実際の使用でソートインスタンス。これは、定義されたstate_field_path_expressionのJPQLで、ソート特定の機能がサポートされます。
クエリページ@ 3
Pageオブジェクトを使用するには、直接ページング可能実装クラスとの直接受信インターフェイスパラメータ。
Paramの使用状況@ 2
デフォルトでは、パラメータは、クエリ文の順序に拘束されています。これは、エラーが発生しやすい位置のパラメータのクエリメソッドの再構築を行います。この問題を解決するには、結合クエリパラメータ名を行い、特定の名前の@Paramアノテーションはメソッドのパラメータを指定することができます。
クエリパラメータをよります。
サポートの表現3.SpEL
春データJPA 1.4の後、SPELで@queryにおける表現の使用をサポートしている変数(紹介)を受信します。
サポートされているSPEL変数は、表4-1に示しました。
次の例では、クエリで式を挿入します。
このSPELサポートより適切なリポジトリのカスタムは、一般的なリポジトリのインターフェースを書きたい場合は、あなたがに対処するために、この表現を使うことができます。
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语句,而非实体的字段名字