JPQLとQueryアノテーション (5/5)
作成:2017-10-28 09:54
更新:2017-10-28 09:54
更新:2017-10-28 09:54
■NamedNativeQuery
@NamedQueryと似たようなものに、「@NamedNativeQuery」というアノテーションもあります。これは、SQLのクエリーをそのまま記述できるアノテーションです。
@NamedQueryは、SQLではなく、JPQLのクエリー文を記述します。@NamedNativeQueryでは、使用しているSQLデータベースのSQLクエリー文を直接書いて実行できるのです。
JPQLは、SQLの完全な代替にはなりません。サポートされていない機能がいろいろとあります。そこで、どうしてもJPQLではうまくないときのために、直接SQLを実行できる仕組みを用意しておいたのでしょう。
この@NamedNativeQueryも、基本的な使い方は@NamedQueryと同じようなものです。
一つだけ、「resultClass」という項目が増えていますが、これは返されるレコードをどのようなクラスとして返すかを指定するものです。何も指定しないとObjectになります。
この@NamedNativeQueryを複数用意したい場合は、@NamedNativeQueriesというアノテーションを使ってまとめることができます。これも使い方は@NamedQueriesと同じで、{}内に複数の@NamedNativeQueryをカンマで区切って記述します。
簡単な利用例を下に挙げておきましょう。先ほどのfindEntityNameLikeを@NamedNativeQueryに書き直したものです。ここでは、queryのテキストを以下のように修正してあります。
プレースホルダは、?1にしてあります。@NamedQueryでは、:findというように名前をつけられましたが、@NamedNativeQueryでは?1を使うようにして下さい。
@NamedNativeQueryは、どのようなときに使うのか? 「JPQLでは表現できない処理を行いたいとき」というのが基本ですが、それ以外にも使う利点があります。実は、@NamedNativeQueryは、@NamedQueryよりも「速い」のです。場合によっては2~3倍近い速度差があります。膨大なアクセスを行うようなとき、この差は大きいですね!
@NamedQueryは、SQLではなく、JPQLのクエリー文を記述します。@NamedNativeQueryでは、使用しているSQLデータベースのSQLクエリー文を直接書いて実行できるのです。
JPQLは、SQLの完全な代替にはなりません。サポートされていない機能がいろいろとあります。そこで、どうしてもJPQLではうまくないときのために、直接SQLを実行できる仕組みを用意しておいたのでしょう。
この@NamedNativeQueryも、基本的な使い方は@NamedQueryと同じようなものです。
@NamedNativeQuery ({
name="名前",
query="……SQLクエリー文……",
resultClass= [class]
})一つだけ、「resultClass」という項目が増えていますが、これは返されるレコードをどのようなクラスとして返すかを指定するものです。何も指定しないとObjectになります。
この@NamedNativeQueryを複数用意したい場合は、@NamedNativeQueriesというアノテーションを使ってまとめることができます。これも使い方は@NamedQueriesと同じで、{}内に複数の@NamedNativeQueryをカンマで区切って記述します。
@NamedNativeQueries({
@NamedNativeQuery(……略……),
@NamedNativeQuery(……略……),
……略……
})簡単な利用例を下に挙げておきましょう。先ほどのfindEntityNameLikeを@NamedNativeQueryに書き直したものです。ここでは、queryのテキストを以下のように修正してあります。
select * from MyDataEntity where name like ?1
プレースホルダは、?1にしてあります。@NamedQueryでは、:findというように名前をつけられましたが、@NamedNativeQueryでは?1を使うようにして下さい。
@NamedNativeQueryは、どのようなときに使うのか? 「JPQLでは表現できない処理を行いたいとき」というのが基本ですが、それ以外にも使う利点があります。実は、@NamedNativeQueryは、@NamedQueryよりも「速い」のです。場合によっては2~3倍近い速度差があります。膨大なアクセスを行うようなとき、この差は大きいですね!
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
// ※MyDataEntityに追記
import javax.persistence.NamedNativeQuery;
import javax.persistence.NamedNativeQueries;
@NamedNativeQueries ({
@NamedNativeQuery(
name="findEntityNameLike",
query="select * from MyDataEntity where name like ?1",
resultClass=MyDataEntity.class
),
})
// ※サーブレットのdoGet
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
EntityManager manager = factory.createEntityManager();
String p = request.getParameter("p");
Query query = manager.createNamedQuery("findEntityNameLike")
.setParameter(1, p);
List list = query.getResultList();
request.setAttribute("list", list);
RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp");
dispatcher.forward(request,response);
}
※関連コンテンツ
「初心者のためのJava Persistence API入門」に戻る