2012-12-28 61 views
0

我升級了我的應用程序以使用Objectify4,但我無法讓訂單正常工作。 這是我做的: 我有一個類我想查詢的優惠。這個類從Mail和Model擴展而來。訂單的屬性應該是在Mail-Class中索引的日期時間。Objectify4訂單?

import com.googlecode.objectify.annotation.EntitySubclass; 
import com.googlecode.objectify.annotation.Serialize; 

@EntitySubclass(index=true) 
public class Offer extends Mail { 

    private static final long serialVersionUID = -6210617753276086669L; 
    @Serialize private Article debit; 
    @Serialize private Article credit; 
    private boolean accepted; 
... 
} 

import com.googlecode.objectify.annotation.EntitySubclass; 
import com.googlecode.objectify.annotation.Index; 

@EntitySubclass(index=true) 
public class Mail extends Model { 
    private static final long serialVersionUID = 8417328804276215057L; 
    @Index private Long datetime; 
    @Index private String sender; 
    @Index private String receiver; 
...} 

import java.io.Serializable; 
import com.googlecode.objectify.annotation.Entity; 
import com.googlecode.objectify.annotation.Id; 
import com.googlecode.objectify.annotation.Ignore; 
import com.googlecode.objectify.annotation.Index; 

@Entity 
public class Model implements Serializable { 
    private static final long serialVersionUID = -5821221296324663253L; 
    @Id Long id; 
    @Index String name; 
    @Ignore transient private Model parent; 
    @Ignore transient private boolean changed; 
...} 


import com.googlecode.objectify.Objectify; 
import com.googlecode.objectify.ObjectifyService; 

public class DatabaseService { 
    static { 
     ObjectifyService.register(Model.class); 
     ObjectifyService.register(Mail.class); 
     ObjectifyService.register(Offer.class); 
    } 

    public static Objectify get() { 
     return ObjectifyService.ofy(); 
    } 
} 

,這就是我想做的事:

Query<Offer> result = DatabaseService.get().load().type(Offer.class).order("-datetime"); 

Unfortunely,結果總是不排序。

有沒有人提示?

回答

1

在低水平,該加載操作有兩個部分:

  • 過濾器通過^ I =發售
  • ORDER BY日期時間降序

爲了使其工作,你將需要像這樣的多屬性索引:

<datastore-index kind="Model" ancestor="false"> 
    <property name="^i" direction="asc"/> 
    <property name="datetime" direction="desc"/> 
</datastore-index> 

但是,你幾乎肯定會濫用d通過讓所有的實體擴展一個多態模型來達到目的。如果您嘗試將所有實體都塞進一個單獨的實體中,您將來會遇到許多問題;一方面,實際上每個查詢都需要包含鑑別器的多屬性索引。

你可以有一個共同的基類,只是不要使它成爲那種。保持繼承層次結構,但將@Entity移至(比如說)Mail。如果您想要一個真正的多態層次結構,Offer仍然可以擁有@EntitySubclass。

仔細閱讀物品概念文檔並仔細挑選您的種類。

+0

鏈接:https://code.google.com/p/objectify-appengine/wiki/Entities#Polymorphism – konqi