2017-05-14 46 views
1

這裏我使用Datastore API創建,更新&檢索實體。如何使用數據存儲區api對子實體進行排序

我的用例是,必須得到一個父實體的孩子和大孩子實體。

我的實體結構如下:

Company 
    --> Employee 
      --> Address (Multiple Address entities). 

這裏我有Company實體鍵,我需要一起配置到員工的所有Address實體獲取Employee細節。

例子:

Company --> Aaa 
    Employee --> John 
        Address --> California 
        Address --> Redwood 
    Employee --> Robert 
        Address --> New York 
        Address --> Washington 

我需要的結果是:

  1. 約翰&的員工實體羅伯特與各Address實體一起。

  2. 員工實體應按名稱排序。

我的查詢如下:

DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); 

Query query = new Query().setAncestor(companyKey); 
datastore.prepare(query).asList(FetchOptions.Builder.withDefaults()); 

上面的查詢返回的結果#1規定。

但無法使用此查詢按名稱排序Employee實體。 當我試圖添加這類條款query.addSort("name", SortDirection.ASCENDING)它如下拋出一個錯誤:

java.lang.IllegalArgumentException: kind is required for all orders except __key__ ascending 
at com.google.appengine.api.datastore.DatastoreApiHelper.translateError(DatastoreApiHelper.java:50) 
at com.google.appengine.api.datastore.DatastoreApiHelper$1.convertException(DatastoreApiHelper.java:121) 

如何,而在查詢中使用的祖先路徑子實體排序?

回答

1

由於您沒有查詢特定種類(例如地址或員工),因此您的查詢被認爲是無價查詢。你只是說讓我所有具有指定祖先的實體。無情的查詢只能按鍵排序(__key__)。沒有其他屬性支持。

documentation指出 -

無類型查詢

查詢,沒有實物和沒有祖先檢索所有的 從雲存儲應用程序中的實體。這種無愛的查詢不能 包含過濾器或屬性值的排序。但是,它們可以根據實體鍵過濾 並使用祖先過濾器。鍵過濾器可以 使用指定作爲屬性名稱:

你可能要考慮修改你的模型地址存儲爲嵌入列表到Empoyee實體,看看是否能更好地工作。

相關問題