(4)ソート条件の指定-1
【リスト6】: ソート条件指定(成功)
03 | public String revOrdTran22() { |
05 | Query query = new Query( "ordTran" ); |
06 | query.addFilter( "shopno" , Query.FilterOperator.EQUAL, "akiba01" ); |
07 | query.addFilter( "price" , Query.FilterOperator.GREATER_THAN, 50000 ); |
08 | query.addSort( "price" , SortDirection.DESCENDING); |
09 | List<Entity> otran = ds.prepare(query).asList( |
10 | FetchOptions.Builder.withOffset( 0 )); |
Queryでは、フィルタを用いたデータの絞り込みのほかに、ソート条件を指定することができます。ソート条件は、ASCENDING(昇順)またはDESCENDING(降順)のどちらかで指定します。リスト6は、リスト5に価格による降順ソート条件を追加しています。
ただし、ソート条件には制約があり、フィルタで指定したプロパティ項目以外は指定できません。例えば、リスト7の場合、ソート条件に指定したプロパティ項目が、フィルタ項目とは異なる受注日(orddate)であるため、画面8のようなエラー・メッセージが表示されて実行失敗になります。
【リスト7】: ソート条件指定(失敗)
03 | public String revOrdTran23() { |
05 | Query query = new Query( "ordTran" ); |
06 | query.addFilter( "shopno" , Query.FilterOperator.EQUAL, "akiba01" ); |
07 | query.addFilter( "price" , Query.FilterOperator.GREATER_THAN, 50000 ); |
08 | query.addSort( "orddate" , SortDirection.DESCENDING); |
09 | List<Entity> otran = ds.prepare(query).asList( |
10 | FetchOptions.Builder.withOffset( 0 )); |

|
画面8: Query実行でのエラー表示(クリックで拡大) |
ただし、この場合、リスト8のように、フィルタ項目にある価格(price)をプライマリのソート条件に指定し、受注日(orddate)をセカンダリのソート条件にに指定すれば、Query実行は成功します。
【リスト8】: ソート条件指定の変更(成功)
03 | public String revOrdTran24() { |
05 | Query query = new Query( "ordTran" ); |
06 | query.addFilter( "shopno" , Query.FilterOperator.EQUAL, "akiba01" ); |
07 | query.addFilter( "price" , Query.FilterOperator.GREATER_THAN, 50000 ); |
08 | query.addSort( "price" , SortDirection.DESCENDING); |
09 | query.addSort( "orddate" , SortDirection.ASCENDING); |
10 | List<Entity> otran = ds.prepare(query).asList( |
11 | FetchOptions.Builder.withOffset( 0 )); |
3.2. Query(String kind, Key , ancestorKey)
App EngineのQueryでは、上位(祖先)のテーブルのキーを指定して実行することもできます(Ancestorクエリー)。
【リスト9】: Ancestorクエリーの例
03 | public String revOrdTran5j() { |
05 | Key okey = KeyFactory.createKey( "ordMas" , "omas001" ); |
06 | Query query = new Query( "shopMas" , okey); |
07 | List<Entity> oshop = ds.prepare(query).asList( |
08 | FetchOptions.Builder.withOffset( 0 )); |
リスト9は、Ancestorクエリーの例です。
- (1)では、オーダー・マスターのkind名とキー名からキーを生成します。
- (2)では、Queryの第2引数で、(1)で生成したキーを指定してQueryインスタンスを生成しています。
Queryはショップ・マスター(shopMas)に対する条件検索ですが、親テーブル(kind)のキー指定によって、親キーで指定されたエンティティの子エンティティだけが検索対象となります。
3.3. Query(Key ancestorKey)
Queryでは、実際に使用される機会はほとんどないと思いますが、Ancestorキーだけを指定して実行することができます。
【リスト10】: Ancestorキーのみを指定してQuery実行
03 | public String revOrdTran4d() { |
05 | Key okey = KeyFactory.createKey( "ordMas" , "omas001" ); |
06 | Query query = new Query(okey); |
07 | List<Entity> ent = ds.prepare(query).asList( |
08 | FetchOptions.Builder.withOffset( 0 )); |
09 | for (Entity e : ent) { |
リスト10は、Ancestorキー指定でのサンプルです。(1)では、ルートになるオーダー・マスターのキーを生成しています。(2)では、生成されたキーだけを引数に指定して、Queryを実行しています。

|
画面9: Ancestorキーのみを指定したQueryのDWR画面から実行(クリックで拡大) |
この検索をDWRの画面から実行すると、画面9のようになります。画面右で切れている部分をすべて表示すると、画面10のようになります。

|
画面10: Ancestorキーのみ指定の実行結果をすべて表示(クリックで拡大) |
画面10のように、Ancestorキーだけを指定したQueryでは、その子孫に相当するテーブル(kind)のエンティティすべてが検索対象となります。
3.4. 引数無しのQuery Query()
引数を指定しないQueryもあります。この検索によって、エンティティ・オブジェクトを探しだすことができます。しかし、現状では、あまり用途はないでしょう。
【リスト11】: 引数無しのQuery
03 | public String revAll() { |
05 | Query query = new Query(); |
06 | List<Entity> smas = ds.prepare(query).asList( |
07 | FetchOptions.Builder.withOffset( 0 )); |