DatastoreのDateによるフィルタリングはちょっと怪しい?

@iwasaki 9views 更新:2015年10月5日

Javaを使ってDatastoreから日付のカラムを用いて、過去1ヶ月より新しいデータを取ってくる場合のクエリは以下のようになるかと思います。runQueryは http://hacknote.jp/archives/7017/ のものを使用

    /**
     * @return
     * @throws DatastoreException
     */
    public static List<Entity> listDatas() throws DatastoreException {

        Query.Builder query = Query.newBuilder();
        query.addKindBuilder().setName("Hoge");
        query.addOrder(DatastoreHelper.makeOrder("date",
                PropertyOrder.Direction.DESCENDING));

          Calendar cal = Calendar.getInstance(); cal.add(Calendar.MONTH, -1);
          query.setFilter(DatastoreHelper.makeFilter("date",
          PropertyFilter.Operator.GREATER_THAN_OR_EQUAL,
          DatastoreHelper.makeValue(cal.getTime())));

        return runQuery(query);
    }

このとき DatastoreHelper.makeValue(cal.getTime())) でData型を渡すことができますが、このパラメータは実際には以下の様なプロパティになります。

この時タイムスタンプはmicrosecondsになります。

property_filter {
  property {
    name: "date"
  }
  operator: GREATER_THAN_OR_EQUAL
  value {
    timestamp_microseconds_value: 1441445046564000
  }
}

Datastoreから取得したデータも同じ形式になるため、

Date型にコンバートするときには1000で割らないとおかしなデータになります。

  Date date2 = new Date();
  date2.setTime(date.getTimestampMicrosecondsValue() / 1000);

ログイン / 新規登録してコメントする

このソースコードをストックして後で利用したり、作業に利用したソースコードをまとめることができます。

こちらもお役に立つかもしれません