JPQLとQueryアノテーション (3/5)
作成:2017-10-28 09:49
更新:2017-10-28 09:49
更新:2017-10-28 09:49
■NamedQueryにパラメータを渡す
単純に、指定したクエリーを実行するだけなら簡単ですが、これだと複雑なクエリーは実行できません。必要に応じてクエリーで使う値などを後から設定できたほうが遥かに便利です。
NamedQueryのクエリー文では、あらかじめプレースホルダとなる値をテキスト内に埋め込んでおき、後からパラメータを設定してそこに値をはめ込み実行させることができます。このプレースホルダは以下のように記述します。
例えば、MyDataEntityから特定のIDのレコードを取り出したい場合は、こんな具合にクエリー文を用意しておきます。
名前をつけず、順番に値を埋め込む場所を指定しておきたい場合は、?1、?2、?3……といった具合に、?の後に数字を順番に割り当てていきます。
名前を付ける場合は、例えば、:hoge というように記述をします。これで、hogeという名前がパラメータとして設定できるようになります。
こうしてクエリー内に埋め込まれたプレースホルダは、createNamedQueryでクエリーを作成する際にパラメータとして組み込むことができます。
createNamedQueryの後に、そのままメソッドチェーンで次のメソッドを記述していきます。setParameterは2つの引数が用意されています。第1引数に、どのプレースホルダに値を設定するかを指定し、第2引数に値を渡します。
例えば、先ほど挙げたサンプルの場合を考えてみましょう。これらのサンプルですね。
この?1や:id_value に値を受け渡すには、以下のようにQueryを作成します。
これで、?1や:id_valueにゼロの値が渡されます。こんな具合に、パラメータを使うことで、クエリーに必要な値などを後からはめ込んで利用すうることができるのです。
簡単な利用例を下に挙げておきましょう。MyDataEntityクラスと、MyDataEntityServletクラスにコードを追記して使って下さい。localhost:8080/hello?p=taro というように、pパラメータに値を指定してアクセスすると、nameの値がそのpの値と同じものだけを表示します。
■プレースホルダの指定
NamedQueryのクエリー文では、あらかじめプレースホルダとなる値をテキスト内に埋め込んでおき、後からパラメータを設定してそこに値をはめ込み実行させることができます。このプレースホルダは以下のように記述します。
名前をつけない場合―― ?1 ?2 ?3
名前を付ける場合―― :名前
例えば、MyDataEntityから特定のIDのレコードを取り出したい場合は、こんな具合にクエリー文を用意しておきます。
select x from MyDataEntity x where x.id = ?1
select x from MyDataEntity x where x.id = :名前
名前をつけず、順番に値を埋め込む場所を指定しておきたい場合は、?1、?2、?3……といった具合に、?の後に数字を順番に割り当てていきます。
名前を付ける場合は、例えば、:hoge というように記述をします。これで、hogeという名前がパラメータとして設定できるようになります。
■パラメータの値を渡す
こうしてクエリー内に埋め込まれたプレースホルダは、createNamedQueryでクエリーを作成する際にパラメータとして組み込むことができます。
entity.createNamedQuery( クエリー名 ).setParameter( 指定 , 値 );
createNamedQueryの後に、そのままメソッドチェーンで次のメソッドを記述していきます。setParameterは2つの引数が用意されています。第1引数に、どのプレースホルダに値を設定するかを指定し、第2引数に値を渡します。
例えば、先ほど挙げたサンプルの場合を考えてみましょう。これらのサンプルですね。
select x from MyDataEntity x where x.id = ?1
select x from MyDataEntity x where x.id = :id_value
この?1や:id_value に値を受け渡すには、以下のようにQueryを作成します。
変数 = entity.createNamedQuery( クエリー名 ).setParameter( 1, 0 );
変数 = entity.createNamedQuery( クエリー名 ).setParameter( "id_value", 0 );
これで、?1や:id_valueにゼロの値が渡されます。こんな具合に、パラメータを使うことで、クエリーに必要な値などを後からはめ込んで利用すうることができるのです。
簡単な利用例を下に挙げておきましょう。MyDataEntityクラスと、MyDataEntityServletクラスにコードを追記して使って下さい。localhost:8080/hello?p=taro というように、pパラメータに値を指定してアクセスすると、nameの値がそのpの値と同じものだけを表示します。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
// ※MyDataEntityクラスのアノテーション import javax.persistence.NamedQuery; @NamedQuery( name="findEntityNameLike", query="select d from MyDataEntity d where d.name like :find" ) // ※サーブレット側の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("find", p); List list = query.getResultList(); request.setAttribute("list", list); RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp"); dispatcher.forward(request,response); }
※関連コンテンツ
「初心者のためのJava Persistence API入門」に戻る