超言理論

特に益もない日記である

GAE/GQL in Java

GAEのデータストア、GQLを扱うときに躓いた点

 メモ程度、Javaの場合のみ。
もし誰かの役に立ったらうれしいなぁ。

  • 基本的な書き方

公式のJDO取り扱いを基本としてPersistenceManager インスタンスの取得
Query query = pm.newQuery("hogeEntities");
//呼び出すエンティティ名
  query.declareImports("import hogehoge");
//もし特殊な型を使う場合はそれに応じてファイルをインポート
  query.setRange(0, 10);
//取り出す個数を何個目から何個目までと指定(この場合0~10個目の計10個)
query.setFilter("arg == 'hogehoge'");
//WHERE句、検索条件(この場合 argが"hogehoge"のとき)
query.setOrdering("id desc");
//order by句、並び替え。(idを降順で)

  • Datastore Indexesの話

 先のような書き方をすると実は動かない…
プロジェクト/war/WEB-INF/にdatastore-indexes.xmlというのを作って、以下のように記述しないと上記のクエリは実行できない。

autoGenerate="true">




これを用意しなければ、
This query needs this index:
− kind: hogeEntities
properties:
− name: arg
− name: id
direction: desc
と「そのクエリ実行するにはインデックスが必要ですよー」といわれます。

 where句でもし arg1='hoge' AND arg2='hogehoge'と書きたかったら、javaでクエリを作ったときに
Query query = pm.newQuery("hogeEntities");
query.setFilter("arg1 == 'hoge' && arg2 == 'hogehoge'");
と書きます。つまりsetFilterなどの中ではGAEのData Viewerの"By GQL"と書いてあるテキストボックスの中で動くような書き方ではなく、Javaのプログラムで書くような書き方で書いて " (ダブルクオーテーション)でくくる形。

  • マニュアルよく読む話

 PythonではIN演算子や!=演算子をサポートしているそうですが(Data Viewerの"By GQL"でも使える)、Javaではサポートされていませんので注意。これ(IN演算子を使おうとして)で2〜3時間悩んでたのは秘密です。


Copyright © 2012-2016 Masahiro MIZUKAMI All Rights Reserved.