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

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

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

■クエリーを指定してQueryを作成する

では、サーブレットを作成しましょう。下のリスト欄に、FindData2Servletクラスのソースコードを記述しておきます。これで、先ほどのfind2.htmlでテキストエリアにクエリーを記述して実行すると、結果を取得し表示できるようになります。例えば、
where id > 1
このようにテキストエリアに記述して実行してみましょう。IDが1以上のデータが検索され表示されます。これは、実際には以下のようなクエリーとして実行されています。
select from jp.tuyano.LinkData where id > 1
見ればわかるように、「select from モデルクラス where 条件」という形になっています。テーブルとモデルクラスの違いはあれ、基本的にはSQLとほぼ同じですね。JDOQLは、このように基本的な部分はSQLの文法をそのまま借りてきています。ですから、SQLがわかればJDOQLもほぼすぐに理解出来るようになります。

JDOQLのクエリーを実行する場合も、やはりnewQueryメソッドでQueryインスタンスを作成し、利用します。ただし、先ほどとは呼び出し方が少し違います。
list = (List<LinkData>)manager.newQuery(query).execute();
このようになっていますね。newQueryの引数に、実行するクエリーのStringを渡し、それをexecuteしています。このように、クエリーをテキストとして用意する場合には、そのテキストをnewQueryに渡すだけで、setFilterだのよけいなメソッドを呼び出し設定をする必要がありません。場合によっては、こちらのほうがはるかに簡単でしょう。

JDOQLを利用する場合の最大の問題は、「SQLではあるが、JDOQLではサポートされていない機能がたくさんある」ということでしょう。いえ、JDOQLが……というより、GAEのデータストアが……と考えてください。

その最たるものは「全文検索(あいまい検索)」です。SQLでは、「where title == '%hoge%'」というようにして、「テキストを含むもの」を探すことができますが、GAEのデータストアではこれがサポートされておらず、完全一致したテキストしか検索できません。

また、複数テーブルを連携して処理する「join」関係も使えません。これは、データストアがリレーショナルデータベースではないから当然なのですが……。これについては、また別の形で実装することになります。(これについては次回に)

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

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

●プログラム・リスト●

package jp.tuyano;

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

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

@SuppressWarnings("serial")
public class FindData2Servlet 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 query = "select from jp.tuyano.LinkData " + req.getParameter("find");
		PrintWriter out = resp.getWriter();
		List<LinkData> list = null;
		try {
			list = (List<LinkData>)manager.newQuery(query).execute();
		} 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)プログラミング入門」に戻る