Cosminexus V9 アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)
JPQLは,データベースを検索・更新したり,データベースが持っている集合関数などの機能を利用したりするためのクエリ言語です。SQLがテーブルを対象としたクエリ言語であるのに対して,JPQLはエンティティクラスを対象としたJPA仕様で定義されているクエリ言語です。
クエリはアノテーションまたはO/Rマッピングファイルで定義できます。クエリと同じ永続化ユニットでエンティティが定義されている場合,エンティティの集合を表す抽象スキーマ型をクエリで使用できます。また,パス式を使用すると,永続化ユニット内で定義されたリレーションシップをわたってクエリを使用できます。パス式の詳細については,「6.17.4(2) パス式」を参照してください。
アプリケーションにJPQLを記述して実行すると,次の順序で接続先のデータベースに対してSQLが発行されます。
ここでは,JPQLの使用方法について説明します。
JPQLを使用してQueryオブジェクトを取得するためには,CJPAプロバイダが提供する次のEntityManagerインタフェースのメソッドを使用します。EntityManagerインタフェースのメソッドについて説明します。
createQueryの記述例を次に示します。引数には実行するJPQL文を指定します。
Query q = em.createQuery( "SELECT c " + "FROM Customer c " + " WHERE c.name LIKE "Smith"); |
あらかじめ名前を付けて定義しておくことのできるクエリを名前付きクエリといいます。名前付きクエリは,@NamedQueryを任意のエンティティクラスに付与して定義します。@NamedQueryのname属性にクエリ名を指定して,query属性にはJPQL文を指定します。
CJPAプロバイダの場合,同じ名称の名前付きクエリを複数指定することはできません。同じ名称の名前付きクエリを複数指定した場合には,警告メッセージKDJE55535-Wを出力します。CJPAプロバイダで指定した場合,どのクエリが動作するかは保証しません。
次に,@NamedQueryの定義例を示します。この例では,@NamedQueryを使用してあらかじめfindAllCustomersWithNameという名前でクエリを登録しています。アプリケーションのcreateNamedQueryメソッドに登録した名前付きクエリ名を渡すことで,事前に登録されているクエリを取得して利用します。
@NamedQuery( name="findAllCustomersWithName", query="SELECT c FROM Customer c WHERE c.name LIKE :custName" ) @Entity public class Customer { ・・・ } |
@Stateless public class MySessionBean { ・・・ @PersistenceContext public EntityManager em; ・・・ public void doSomething() { ・・・ Query q = em.createNamedQuery("findAllCustomersWithName") .setParameter("custName", "Smith"); } } |
なお,同一の永続化ユニット内では,ほかのエンティティで定義した名前付きクエリを使用することもできます。
JPQLでは,クエリを生成する際に,WHERE節に記述する条件式にパラメタを使用して,動的に値を設定することができます。パラメタの値はQueryインタフェースのsetParameterメソッドで設定します。パラメタには,位置パラメタと名前付きパラメタがあります。それぞれについて説明します。
Query setParameter(int 位置, Object 値) |
Query q = em.createQuery( "SELECT c FROM Customer c WHERE c.balance < ?1") .setParameter(1, 20000); |
Query setParameter(String パラメタ名, Object 値) |
Query q = em.createQuery( "SELECT c FROM Customer c WHERE c.name LIKE :custName") .setParameter("custName", "John"); |
なお,パラメタを使用するときには次のことに注意してください。
生成したクエリを実行して,そのクエリ結果を返したり,更新クエリを実行したりするためには,Queryインタフェースの次のメソッドを使用します。それぞれのメソッドについて説明します。
このメソッドは,クエリ結果を単一のオブジェクトとして返す場合に使用します。
メソッドを実行するとデータを検索します。検索の結果,ヒットした単一の行をエンティティオブジェクトに格納し,Object型で返します。Object型の戻り値は対象のエンティティクラスにキャストする必要があります。
複数の行がヒットした場合は,NonUniqueResultException例外が発生します。ヒットする行がなかった場合は,NoResultException例外が発生します。
このメソッドは,クエリ結果をリストとして返す場合に使用します。
メソッドを実行するとデータを検索します。検索の結果,ヒットした複数の行をエンティティオブジェクトに格納し,リストで返します。実行結果として複数の行が返されること想定しているため,ヒットする行が一つもなかった場合は,空のリストが返ります。
このメソッドは,更新クエリを実行する場合に使用します。
メソッドを実行するとテーブルから複数の行を一斉に削除または更新するクエリを実行します。実行結果にはヒットした行の件数が返ります。
All Rights Reserved. Copyright (C) 2012, 2015, Hitachi, Ltd.