我有三个实体,如Human,Dog,Treat。 Treat实体具有键Key<Dog>
,Dog实体具有键Key<Human>
。当我查询Treat时,我想要一个包含Dog的实际实体的响应,而Dog的实体必须包含Human的实际实体:而不仅仅是键。我该怎么做?
更新
所以我希望能够执行以下两个查询
getAllTreats()
应该返回所有款待的清单,通过每个款待,我可以访问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;
}
答案 0 :(得分:1)
尝试使用Ref<?>
和@Load
注释而不是Key<?>
。 Ref<?>
的工作方式与Key<?>
类似,但允许您直接访问实际的实体对象。此外,@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以及所有父项(在您的情况下为Dog
和Human
实例/ 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();