2014-02-11 43 views
4

我正在試驗App Engine,Datastore和Objectify 4.我有一個工作的Objectify查詢,它從數據存儲庫中提取給定類型的所有實體。我試圖根據日期對結果進行排序:添加排序到Objectify查詢導致空結果

List<MyEntity> entities = OfyService.ofy().load().type(MyEntity.class).order("-createdDate").list(); 

但是在我添加訂單之後,查詢返回0條記錄。這是我的實體類:

@Entity 
public class MyEntity 
{ 
    @Id Long id; 
    Long userID; 
    @Ignore String username; 
    @Index String name; 
    String url; 
    String description; 
    @Index Date createdDate; 
    @Index int viewCount; 
} 

我試着用其他數據類型命令沒有成功。爲什麼會發生?

+1

很難說沒有看到完整的代碼,但是如果您在order()中刪除'-'以按升序返回結果,您會得到結果嗎?根據[文檔](https://developers.google.com/appengine/docs/java/datastore/indexes#Java_Index_configuration),App Engine應該自動爲_Queries創建一個索引,不使用過濾器,只有一個排序順序,無論是上升還是下降。 – tx802

+0

當從order()中刪除「 - 」時,我會得到相同的結果。出於某種原因,實體類中定義的索引都不存儲在數據存儲區中,請閱讀我剛剛添加的答案 –

回答

0

我通過cloud.google.com查看數據存儲區,打開任何實體時,所有字段都標記爲「未編入索引」,包括在實體類中使用@Index定義的字段。當我手動標記數據存儲區中的「索引」字段時,查詢的分類工作。當通過Objectify保存時,實體中所有用@Index標記的字段是否不應該在數據存儲中編入索引?我在這裏錯過了什麼?

+2

是的,他們_should_,但沒有看到完整的實體類,很難肯定地說。實體初次創建時是否存在'@ Index'註釋?如果沒有,您需要在添加'@ Index'註釋後重新保存實體。在通過雲控制檯修改索引規則時,您可能會隱式執行此操作。 – tx802

+1

如果這個評論不能成爲答案,我會感到非常驚訝。 – stickfigure

+0

在將@Index添加到createdDate之前,我確實可能會保存數據存儲中的一些實體。但無論如何,添加註釋後保存的任何新實體都應與索引一起存儲?至於現有的方法,我試圖在一個方法中獲取所有這些數據,然後重新保存它們,仍然將所有字段標記爲「未索引」。用完整的實體更新我的問題 –

2

我們需要在WEB-INF/datastore-indexes.xml中手動定義索引。

<?xml version="1.0" encoding="utf-8"?> 
<datastore-indexes 
    autoGenerate="true"> 
    <datastore-index kind="AppMedia" ancestor="false"> 
     <property name="createdDate" direction="desc" /> 
    </datastore-index> 
</datastore-indexes> 

然後索引被正確創建並且查詢將工作。 注意:查詢將只適用於正確配置索引後添加的那些行。