DatastoreにLow Level APIでアクセスする

https://hacknote.jp/archives/6276/

でDatastoreに接続したあとは以下のようにしてSELECT文を発行できます。

まずはQueryを実行するためのメソッドを用意します。

なおこのメソッドではまだ以下に対応していません。

Datastoreでは1つのクエリで最大1000件までしか取得できないため、結果が1000件を超える場合はlimit offsetをつかって再帰的にデータを取得する必要があります。

  /**
   * Run a query on the datastore.
   * 
   * @return The entities returned by the query.
   * @throws DatastoreException
   *           on error
   */
  static List<Entity> runQuery(Query query) throws DatastoreException {
    RunQueryRequest.Builder request = RunQueryRequest.newBuilder();
    request.setQuery(query);
    RunQueryResponse response = datastore.runQuery(request.build());

    if (response.getBatch().getMoreResults() == QueryResultBatch.MoreResultsType.NOT_FINISHED) {
      // @todo 再帰処理
    }
    List<EntityResult> results = response.getBatch().getEntityResultList();
    List<Entity> entities = new ArrayList<Entity>(results.size());
    for (EntityResult result : results) {
      entities.add(result.getEntity());
    }
    return entities;
  }

このメソッドを呼ぶ方法は以下のようにします。

setNameで該当するテーブルを指定します。

1000件を超えるデータに対応するためにはlimit,offsetを指定しておいたほうがいいでしょう。

  /**
   * @return
   * @throws DatastoreException
   */
  private static List<Entity> listHoges() throws DatastoreException {

    Query.Builder query = Query.newBuilder();
    query.addKindBuilder().setName("hoge");
    // @todo ソート処理

    return runQuery(query.build());
  }