libro
www.tuyano.com
初心者のためのJava Persistence API入門

JPQLとQueryアノテーション (5/5)

作成: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と同じようなものです。
@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倍近い速度差があります。膨大なアクセスを行うようなとき、この差は大きいですね!

※プログラムリストが表示されない場合

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