libro
www.tuyano.com
Google App Engine for Java(GAE/J)プログラミング入門

JDOQLによる検索について (2/4)

作成:2010-05-07 15:17
更新:2010-05-10 17:34

■Queryクラスによる検索の手順

では、/findで公開されるFindDataServletクラスを作成しましょう。下のリスト欄にソースコードを掲載しておきます。

ここでは、getParameter("find")で取得したパラメータを元にして検索をしています。全体の流れをざっと整理すると以下のようになります。

1.PersistenceManagerFactory/PersistenceManagerの準備
まず、例によってこれらのオブジェクトを用意します。これはJDO利用の際の基本ですね。

2.Queryインスタンスを作成する
Query query = manager.newQuery(LinkData.class);
JDOで検索するための情報を管理するのが、Queryクラスです。このインスタンスは、PersistenceManagerの「newQuery」というメソッドで作成します。引数には、検索する対象となるクラスを指定します。

3.フィルターの設定をする
query.setFilter("title == findTitle");
ここでは、titleフィールドが、送信されたパラメータのテキストと等しいものを検索します。こうした「特定の条件に符号したオブジェクトに絞り込む」というのに用いられるのが、フィルターです。これは「setFilter」というメソッドで設定します。ここでは、"title == findTitle"となっていますが、これは「titleフィールドの値がfindTitleと等しい」というのを条件に設定しているわけですね。(ここで、「findTitleっていうのは何だ?」と思うでしょうが、これはこの後で登場します)

4.並び順の設定をする
query.setOrdering("datetime desc");
ここでは、フィルターの他に、データの並び順の指定もしてみました。これは「setOrdering」というメソッドで行います。ここでは、"datetime desc"としていますが、これにより「datetimeフィールドを基準に、降順で並び替える」ということを意味します。フィルターの値は、このように、"フィールド名 asc/desc"という形で指定します。

5.パラメータの設定をする
query.declareParameters("String findTitle");
最後に、パラメータを設定します。先に、setFilter("title == findTitle")のところで、findTitleという値が登場しました。このままでは、findTitleが何だかわかりません。そこで、「findTitleは、こういう値が渡されます」というパラメータの設定を行うのが、このdeclareParametersです。ここでは、"String findTitle"とすることで、findTitleにStringのパラメータが設定されるようになります。

6.Queryを実行する
list = (List<LinkData>)query.execute(param1);
「execute」を呼び出し、Queryを実行します。このとき、引数にparam1が渡されています。このパラメータの値は、そのままdeclareParametersで指定されたfindTitleにはめ込まれて実行されます。結果は、Listインスタンスとして返されますので、後はここから必要に応じてオブジェクトを取得し、処理をしていけばいいわけです。


とりあえず、ここで使った「setFilter」「setOrdering」「declareParameters」の3つのメソッドがわかれば、Queryに必要な設定をして実行させることが可能になるでしょう。これに加えて、「setRange」というのも覚えておくと大変便利です。これは、
[Query].setRange( 開始位置 , 取得する数 )
このように呼び出します。このsetRangeは、特定の位置から決まった数だけオブジェクトを取得するためのものです。SQLのlimit/offsetに相当するものと考えればわかりやすいでしょう。

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

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

package jp.tuyano;

import java.io.*;
import java.util.*;

import javax.jdo.*;
import javax.servlet.http.*;

@SuppressWarnings("serial")
public class FindDataServlet extends HttpServlet {
	public void doGet(HttpServletRequest req,
			HttpServletResponse resp)
			throws IOException {
		PersistenceManagerFactory factory = PMF.get();
		PersistenceManager manager = factory.getPersistenceManager();
		resp.setCharacterEncoding("UTF-8");
		resp.setContentType("text/html");
		req.setCharacterEncoding("utf-8");
		String param1 = req.getParameter("find");
		PrintWriter out = resp.getWriter();
		List<LinkData> list = null;
		Query query = manager.newQuery(LinkData.class);
	    query.setFilter("title == findTitle");
	    query.setOrdering("datetime desc");
	    query.declareParameters("String findTitle");
	    try {
	    	list = (List<LinkData>)query.execute(param1);
		} catch(JDOObjectNotFoundException e){}
		String res = "[";
		if (list != null){
			for(LinkData data:list){
				res += "{id:" + data.getId() + ",url:'" + data.getUrl() + "',title:'" +
					data.getTitle() + "',date:'" + data.getDatetime() +
					"',comment:'" + data.getComment() + "'},";
			}
		}
		res += "]";
		out.println(res);
		manager.close();
	}
}

※関連コンテンツ

「Google App Engine for Java(GAE/J)プログラミング入門」に戻る