JDOQLによる検索について (4/4)
作成:2010-05-07 15:39
更新:2010-05-10 17:36
更新:2010-05-10 17:36
■クエリーを指定してQueryを作成する
では、サーブレットを作成しましょう。下のリスト欄に、FindData2Servletクラスのソースコードを記述しておきます。これで、先ほどのfind2.htmlでテキストエリアにクエリーを記述して実行すると、結果を取得し表示できるようになります。例えば、
JDOQLのクエリーを実行する場合も、やはりnewQueryメソッドでQueryインスタンスを作成し、利用します。ただし、先ほどとは呼び出し方が少し違います。
JDOQLを利用する場合の最大の問題は、「SQLではあるが、JDOQLではサポートされていない機能がたくさんある」ということでしょう。いえ、JDOQLが……というより、GAEのデータストアが……と考えてください。
その最たるものは「全文検索(あいまい検索)」です。SQLでは、「where title == '%hoge%'」というようにして、「テキストを含むもの」を探すことができますが、GAEのデータストアではこれがサポートされておらず、完全一致したテキストしか検索できません。
また、複数テーブルを連携して処理する「join」関係も使えません。これは、データストアがリレーショナルデータベースではないから当然なのですが……。これについては、また別の形で実装することになります。(これについては次回に)
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」関係も使えません。これは、データストアがリレーショナルデータベースではないから当然なのですが……。これについては、また別の形で実装することになります。(これについては次回に)
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
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)プログラミング入門」に戻る