2016-04-07 24 views
0

私は3つのエンティティをHuman、Dog、Treatとして持っています。 TreatエンティティにはキーKey<Dog>があり、DogエンティティにはキーKey<Human>があります。私がTreatについて質問すると、実際の犬のエンティティを含む応答が必要であり、犬のエンティティは、人間のための実際のエンティティを含む必要があります。それ、どうやったら出来るの?Objectify:外部キーの内容を照会

更新

各を通じて、私はその後、犬のデータにアクセスすることができ扱うすべてのお菓子のリストを返す必要がありますだから私は、次の2つのクエリ

  • getAllTreats()を実行できるようにしたいと思いますその犬のデータを介して人間のデータを見つける。
  • 治療IDが与えられたら、私はそれをDogデータと、DogのHumanデータと一緒に取り出すことを望みます。

コード:(。彼は@Parent表記を述べた。しかし、問題はまだ残っている、少なくともtreatIdによって単一扱うためので、私はpgiecek +1を与えた)

@Entity 
public class Human { 
    @Id 
    private Long id; 
    private String name; 
} 

@Entity 
public class Dog { 
    @Id 
    private Long id; 
    private String name; 
    @Load 
    @Parent 
    private Ref<Human> human; 
} 


@Entity 
public class Treat { 
    @Id 
    private Long id; 
    private String name; 
    @Load 
    @Parent 
    private Ref<Dog> dog; 
} 

答えて

1

は一緒にRef<?>を使用してみてくださいKey<?>の代わりに@Load注釈。 Ref<?>Key<?>のように機能しますが、実際のエンティティオブジェクトに直接アクセスすることができます。さらに、@Loadアノテーションを使用すると、関連するエンティティオブジェクトをより効率的に読み込むことができます。

Ref<?>@Loadについて詳しくはこちらをご覧ください。あなたがDog参照にアクセスし、Ref<?>.get()メソッドを介して手動でそれをフェッチする必要があり、各Treatオブジェクトに対して

更新

クエリ1

List<Treat> treats = ofy.load().type(Treat.class).list() 

Humanについても同様です。ただし、親フィールドには@Load注釈を使用できます。あなたがTreatの唯一のIDを持っている場合は、すべての祖先のパスは、実際のエンティティのキ​​ーであるため、

クエリ2

は、実体をロードすることはできません。

エンティティを識別する完全なキーは 種別識別子対は、その祖先パスを指定し、エンティティ自体のものと 終端の配列からなります。

あなたのケースでは、Treatのキーは次のようになります。

Key = [Human:ID, Dog:ID, Treat:ID] 

コンクリートTreatインスタンスを取得するために、あなたはすべての親(あなたのケースでDogHumanインスタンス/ ID)をまたはそのキーと一緒にそのIDのいずれかを知っておく必要があります。キーをStringにシリアル化して後で復元するのに役立つKey<?>.toWebSafeString()Key<?>.create(String)(またはKey<?>.valueOf(String))の方法を見てください。

Treat treat = ... // create a new instance along with its parents 

String webSafeKey = Key.create(treat).toWebSafeString(); 

// do whatever you need 

Key<Treat> treatKey = Key.<Treat>create(webSafeKey); 

Treat loaded = ofy.load().key(treatKey).now(); 
+0

+1しかし、問題があります。祖先のクエリの仕組みは、先祖を知ってからクエリを実行する(つまり、ルートからリーフに)上向きにする必要があるようです。しかし、もし私が持っているものがすべて治療IDであればどうなりますか?どのようにして、人間を含む犬を含むトリートを得るには? –

+0

あなたのエンティティ間に正確な関係が含まれるようにあなたの質問を更新できますか?祖先の道は言及していませんでした。 – pgiecek

+0

私は更新しました。 –