如何获得具有父引用的实体?

时间:2016-08-17 14:18:19

标签: java google-app-engine objectify google-cloud-datastore

在我的Spring项目和使用Google App Engine中,我正在尝试从数据存储中获取实体,但在这种情况下,此实体具有@Parent关系。我只有实体的id,这点不知道有关父关系的信息。 我使用ancestor filterKey尝试了不同的查询,此时我有这个:

@Override
public House getNotRestrictions(Long id){
      return objectifyService.ofy().load().type(House.class).filterKey(Key.create(House.class, id)).first().now();
}

我的模型是这样的:

@Entity
public class House {
  @Id
  public Long id;

  //other attributes

  @Index
  @Parent
  public Key<User> createdBy;

  //methods getter and setters
}

当我执行查询时,它返回到我和null实体。但是存在数据存储区的id。

2 个答案:

答案 0 :(得分:1)

每个实体都有一个密钥,其中包括其种类,ID /名称以及所有祖先的种类+ ID /名称。如果您创建密钥而不传递祖先信息,则此密钥将与您尝试检索的实体不同

另请注意,如果他们有不同的父母,您可以拥有许多具有相同种类和ID的实体。

答案 1 :(得分:0)

只有两种方式:

//1. creating the full key with parent:
Key<House> houseKey = Key.create(Key.create(User.class, userId), House.class, id);

//2. or using the webSafeString key representation which contains the whole key path including namespace and parents:
String webSafeKey = "<encoded key as string>";
Key<House> houseKey = Key.<House>create(webSafe)

//Then you can fetch the entity:
House house = ofy().load().key(houseKey).now();

既然你提到你不认识父母。您可以开始使用webSafeString - 请参阅Key.toWebSafeString()方法