JPAは、データベースからエンティティとその他の永続的なデータを取得するためのクエリを表現する2つの方法をサポートしています:クエリステートメント(Java Persistence Query Language、JPQL)とCriteria API(基準API)。 JPQLは、物理データモデルではなく論理エンティティモデルの操作に使用されるデータベースに依存しないクエリステートメントです。条件付きAPIは、エンティティモデルに基づいてクエリ条件を構築することです
1。Java Persistentクエリステートメントを開始します
コードコピーは次のとおりです。リスト<パーソン> persons = entitymanager.createquery( "select p from person p")。getResultList();
1.このクエリステートメントはSQLに似ています。しかし、それと実際のSQLの違いは、テーブルから選択クエリを作成する代わりに、アプリケーションドメインモデルからエンティティを指定することです。
2。Query Select句には、クエリエンティティのエイリアスのみがリストされています。特定の列のみを照会する場合は、DOT(。)演算子を使用してエンティティプロパティをナビゲートできます。以下に示すように:
コードコピーは次のとおりです。リスト<String> Persons = EntityManager.createquery( "Person PからP.FirstNameを選択します")。getResultList();
1.1。フィルター基準
SQLと同様に、JPQLは、検索基準のフィルタリングに使用される句もサポートします。以下などのほとんどの演算子が含まれます。
コードコピーは次のとおりです。リスト<パーソン> persons = entitymanager.createquery( "pean psage p.age> 23"からpからpを選択)。getResultList();
1.2。投影結果
クエリの量が比較的大きい場合は、プロジェクションを使用して有用な列のみをクエリすることができます。
コードコピーは次のとおりです。/Project List <Object> Persons = EntityManager.createquery( "Select P.FirstName、P.Age from Person P")。getResultList();
1.3。集約クエリ
JPQLの集計クエリ構文はSQLに似ています。たとえば、count
コードコピーは次のとおりです。list<integer> count = entitymanager.createquery( "from person p")。getResultList();
1.4。クエリパラメーター
JPQLは、2種類のパラメーターバインディング構文をサポートしています。
1。位置パラメーター表現
ここで、パラメーターがクエリ文字列に示されています。これは、疑問符(?)の直後にパラメーターに従う数値です。クエリを実行すると、開発者は交換する必要があるパラメーターを指定します
query query = entitymanager.createquery( "p.age =?1およびp.firstname =?2"); query.setParameter(1,21); query.setParameter(2、 "jack");
2。名前付きパラメーター表記
コロン(:)を追跡し、クエリ文字列でそれを示すことにより、開発者はクエリを実行するときに置き換える必要があるパラメーター名を指定します
query query = entitymanager.createquery( "pers = age =:age and p.firstname =:name"); query.setParameter( "age"、21); query.setParameter( "name"、 "jack");
2。クエリを定義します
JPAは、クエリとTypedQuery(JPA 2.0によって導入された)インターフェイスを提供して、クエリを構成および実行します。クエリはオブジェクトタイプを返し、typedQueryは指定されたクラスタイプを返します。
//指定されていない型、returnオブジェクトタイプquery q = entitymanager.createquery( "person p from person p"); // return type as person type as person typedquery <person> q1 = entitymanager.createquery( "select person p from person p"、person.class);
2.1。動的クエリ定義
JPAクエリエンジンは、JPQL文字列を構文ツリーに解析し、式でエンティティオブジェクト関連マップのメタデータを取得し、同等のSQLを生成できます。したがって、動的クエリを実行するには2つの方法があります。
1.Split Stringメソッド
ヒント:SQL注入の問題を引き起こします
/** *ダイナミックスプライシング文字列クエリ条件 * * @param name * @param age * @return */public static string querypersonjpql(string name、int age){string queryql = "select person P return queryql;} // query query = entitymanager.createquery(querypersonjpql( "jack"、21)); 2。クエリ条件の動的パラメーター化された構造(推奨)
/** *動的パラメーター化された構造クエリ条件 * * @return */public static string querypqlbyparams(){string queryql = "pers from pers from p from pers p.firstname =:name and p.age =:age"; return queryql;} query query = entitymanager.createquery(querypersonjpqlbyparams()); query.setParameter( "name"、 "jack"); query.setparameter( "age"、21);2.2。名前付きクエリ定義
名前付きクエリは強力なツールです。 @namedqueryアノテーションを使用して、エンティティのクラス定義の上に配置できる名前のクエリを定義します。この注釈は、クエリの名前とそのテキストを定義します。
ヒント:名前付きクエリは、クエリ結果に対応するエンティティクラスに配置されます
@entity@namedquery(name = "findbyage"、query = "pean psage =:age")public class person {//省略}先端で定義されている名前:名前の付いたものは、永続ユニット全体で一意である必要があります。そうしないと、操作にエラーが発生します。
例えば:
コードコピーは次のとおりです。
スレッド「Main」org.hibernate.duplicatemappingexceptionの例外:org.hibernate.boot.internal.inflightmetadatacollectionimpl.CheckQueryNameの複製クエリマッピングFindByage
電話
コードコピーは次のとおりです。
List <Person> PEOPLE = ENTITYMANAGER.CREATENAMEDQUERY( "FindByage"、person.class).setParameter( "age"、21).getResultList();
クラスが2つ以上の名前のクエリを定義する場合、@namedqueries()に配置する必要があります。
2.3.バインディングパラメーター
前の例を通して、パラメーターをバインドする方法は2つあります。1。位置パラメーター化結合。 2。名前パラメーター化されたバインディング。すべては、クエリインターフェイスのSetParameterメソッドを介してバインドされています。
1。位置パラメーター化
typedQuery <x> setParameter(int position、object値);
2。名前パラメーター化
typedQuery <x> setParameter(string name、object value);
1つ目は、位置パラメーター化されたバインディングです。位置が変更された場合、バウンドコードを変更する必要があります。 2番目のタイプをお勧めします。
2.4。クエリを実行します
クエリインターフェイスとTypedQueryインターフェイスは、クエリを実行する3つの異なる方法を提供します。
1.ExecuteUpdate
バッチの更新または削除を実行するために使用されます
2.GetSingleresult
単一の結果セットを取得します。データが取得されない場合、noresultexceptionがスローされます。複数のデータが取得された場合、非ユニックのgultExceptionがスローされます
3.GetResultList
対応する結果セットを取得し、セットの順序を指定します。リストは、返品値タイプとして使用する必要があります。データが取得されない場合、空のセットが返され、例外がスローされません
2.5。ページネーション
ページネーションクエリは、setFirstResult()およびsetMaxResults()メソッドを介して完了できます
クエリページ番号は0で、各ページに2つのデータが表示されます
コードコピーは次のとおりです。
List <Person> PEOPLE = ENTITYMANAGER.CREATEQUERY( "Person P"、person.classを選択).setfirstreSult(0).setMaxResults(2).getResultList();
ヒント:これらのクエリが重複した値を返す可能性があるため、コレクション関係で接続されたクエリに使用することはできません。
2.6。クエリタイムアウト
アプリケーションでクエリ応答時間に制限を設定する必要がある場合は、javax.persistence.query.timeoutプロパティをクエリ(JPA 2.0によって導入)に設定するか、persistenceプロパティの一部として使用できます。このプロパティは、クエリが終了する前に実行できる==ミリ秒の数を定義します。クエリタイムアウトの場合、querytimeoutexceptionがスローされます。
typedQuery <serson> query = entitymanager.createquery( "select p from person p"、person.class); //ユニットはmilliseconds javax.persistence.timeoutquery.sethint( "javax.persistence.query.timeout"、5000);
2.7。バッチの更新と削除
バッチアップデートエンティティは、更新ステートメントを通じて完了します。エンティティのバッチ削除は、削除ステートメントを使用して行われます。どちらもエンティティとそのクラスのプロパティを指定します。
entityManager.getTransaction()。 entityManager.createquery( "delete person p p.id =:id"); query1.setParameter( "id"、9); query1.executeUpdate(); entitymanager.getTransaction()。cump();
3。JPQLクエリを使用するための提案
アプリケーションシステムでは、クエリの数は通常、追加、変更、削除よりも使用されます。したがって、クエリを使用して合理的に表示することが特に重要です。
1.名前の付いたクエリ(名前を付けた)を使用することをお勧めします
Persistenceが提供するプログラムは、通常、プリコンパイルされたメソッドを使用して、プログラム初期化フェーズの一部として名前付きクエリを使用します。これにより、JPQLの連続解析とSQLの生成のシステムオーバーヘッドが回避されます。
2.プロジェクションを使用して、最初に少数の列を取得します。
JPAクエリは通常、エンティティ全体のすべての列を返しますが、膨大な量のデータの場合、すべてのエンティティ列を使用する必要はありません。その後、プロジェクションを使用して処理できます。
List <list <object [] >> persons = entitymanager.createquery( "select new list(firstName、age)from person p")。getResultList(); for(object o:persons){system.out.println(o);} // output result [jack、21] [jack、21] [jack、19] [tom、23]上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。