Objectify:查询外键的内容

时间:2016-04-07 15:42:37

标签: java google-app-engine objectify

我有三个实体,如Human,Dog,Treat。 Treat实体具有键Key<Dog>,Dog实体具有键Key<Human>。当我查询Treat时,我想要一个包含Dog的实际实体的响应,而Dog的实体必须包含Human的实际实体:而不仅仅是键。我该怎么做?

更新

所以我希望能够执行以下两个查询

  • getAllTreats()应该返回所有款待的清单,通过每个款待,我可以访问Dog数据,然后通过所述Dog数据查找人力数据。
  • 鉴于一个治疗ID,我想用它的Dog数据和所述Dog的人类数据检索那个治疗。

代码:(我给了pgiecek +1,因为他提到了@Parent符号。但问题仍然存在,至少对于治疗的单一治疗而言)

@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 个答案:

答案 0 :(得分:1)

尝试使用Ref<?>@Load注释而不是Key<?>Ref<?>的工作方式与Key<?>类似,但允许您直接访问实际的实体对象。此外,@Load注释使您可以更有效地加载关联的实体对象。

您可以在此处找到有关Ref<?>@Load的详细信息。

<强>更新

查询1

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

对于每个Treat对象,您必须访问Dog引用并通过Ref<?>.get()方法手动获取它。这同样适用于Human。但是,您可以对父字段使用@Load注释。

查询2

如果您只有Treat的ID,则无法加载实体,因为所有祖先路径实际上是实体的密钥。

  

标识实体的完整密钥由一系列序列组成   kind-identifier对指定其祖先路径并终止   与实体本身的那些。

在您的情况下,Treat的键如下所示。

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

为了检索具体的Treat实例,您需要知道其ID以及所有父项(在您的情况下为DogHuman实例/ ID)或其密钥。查看Key<?>.toWebSafeString()Key<?>.create(String)(或Key<?>.valueOf(String))方法,这些方法可以帮助您将密钥序列化为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();