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)プログラミング入門」に戻る