0

Objectify4 を使用するようにアプリケーションをアップグレードしましたが、順序付けが機能しません。これが私がやったことです: 私は照会したいクラス Offer を持っています。このクラスは、Mail および Model から拡張されています。order の属性は、Mail-Class で索引付けされた日時でなければなりません。

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");

残念ながら、結果は常にソートされません。

ヒントはありますか?

4

1 に答える 1

1

低レベルでは、このロード操作には次の 2 つの部分があります。

  • ^i = オファーでフィルタ
  • 日時順

機能させるには、次のようなマルチプロパティ インデックスが必要です。

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

ただし、すべてのエンティティをポリモーフィック モデルに拡張することで、ほぼ確実にデータストアを悪用しています。すべてのエンティティを単一の種類に詰め込もうとすると、将来多くの問題が発生します。1 つには、実質的にすべてのクエリで、ディスクリミネータを含むマルチプロパティ インデックスが必要になります。

共通の基本クラスを持つことができますが、それを Kind にしないでください。継承階層を維持しますが、@Entity を (たとえば) Mail に移動します。真のポリモーフィック階層が必要な場合は、オファーに @EntitySubclass を含めることができます。

objectify Concepts ドキュメントを注意深く読み、種類を慎重に選択してください。

于 2012-12-28T18:38:44.110 に答える