GAEで条件を指定して検索 | sola's note

sola's note

日ごろのメモを書いていきます。何か新しいものを作るために。

GAE(Google App Engine/J)で検索処理を行う時は
PersistenceManagerという良く分からないマネージャーでQueryオブジェクトを生成して検索を行う。

この時生成されるQueryのオブジェクトにはFilterという条件指定をする事が出来るんだけど、
複数の条件を指定すると

何故か上手くいかない。

例えば
条件が一つの場合、

Query query = pm.newQuery(Hoge.class);
query.setFilter("hoge == 'hoge'");

とやる。
条件を二つにする時に
Listでaddする感覚で

Query query = pm.newQuery(Hoge.class);
query.setFilter("hoge == 'hoge'");
query.setFilter("fuga == 'fuga'");

とやったら、
「hoge==hoge」が

 全 然 機 能 し な い

ちなみにANDを追記して、

Query query = pm.newQuery(Hoge.class);
query.setFilter("hoge == 'hoge' &&");
query.setFilter("fuga == 'fuga'");

でもダメ。
デバックしてみたら、発行されているクエリのwhere以降が

where fuga == fuga

で終わってる
これ(Filter)はもしかしたら1つで固定なのかと思って

Query query = pm.newQuery(Hoge.class);
query.setFilter("hoge == 'hoge' && fuga == 'fuga'");

とか書いてみたら
あっさりいけた。

ちなみに不等式を使った複数プロパティの条件付検索は、
仕様的に無理だそうです。

以下参考。
GAEドキュメント
☆以下引用☆
不等式フィルタが使用できるのは 1 つのプロパティに限られる

クエリが不等式フィルタ(<、<=、>=、>)を使用できるのは、すべてのフィルタにわたって 1 つのプロパティに限られます。
☆引用終わり☆

つまり今回の場合

Query query = pm.newQuery(Hoge.class);
query.setFilter("hoge >= 'hoge' && fuga <= 'fuga'");

は出来ないと思われる。