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入門」に戻る