Google app engine 从数据存储中获取子实体的java-appengnie代码不起作用

Google app engine 从数据存储中获取子实体的java-appengnie代码不起作用,google-app-engine,google-cloud-datastore,Google App Engine,Google Cloud Datastore,我有这段代码来检查数据存储中是否已经存在子实体。问题是它对一个父子关系有效,但对另一个关系总是返回null 我的应用程序中有四种实体-组织、联系人、个人资料和个人资料组织。联系人种类实体是ORG的子级,ProfileOrg是Profile的子级。将联系人添加到组织的逻辑是获取给定组织的所有子实体,然后检查属性。如果属性匹配,则返回实体else null。这非常适用于组织联系关系。但是Profile-ProfileOrg-relationship完全相同的逻辑是行不通的。它总是返回null。下面是

我有这段代码来检查数据存储中是否已经存在子实体。问题是它对一个父子关系有效,但对另一个关系总是返回null

我的应用程序中有四种实体-组织、联系人、个人资料和个人资料组织。联系人种类实体是ORG的子级,ProfileOrg是Profile的子级。将联系人添加到组织的逻辑是获取给定组织的所有子实体,然后检查属性。如果属性匹配,则返回实体else null。这非常适用于组织联系关系。但是Profile-ProfileOrg-relationship完全相同的逻辑是行不通的。它总是返回null。下面是我的代码:

这是获取所有子实体并检查其属性“orgID”是否匹配的代码

public static Entity getSingleProfileOrg(Key profileKey, String orgID) {

    Iterable<Entity> childProfileOrgs = Util.listChildren("profileOrg",profileKey);

    for (Entity e : childProfileOrgs) {
        if (e.getProperty("orgID").toString() == orgID) {
            return e;
        }
    }
    return null;
}
线路

Entity Profile = Product.getProfile(profileID);
应该是工作良好,因为它是用来创建配置文件也和我没有看到任何问题


因为我总是从getSingleProfileOrg(profileKey,orgID)得到一个空值;我最终得到了重复的子实体。

因为在
列表子实体中,您希望基于祖先进行查询,所以您的方法是错误的。应该是这样的:

public static Iterable<Entity> listChildren(String kind, Key ancestor) {
  logger.log(Level.INFO, "Search entities based on parent");
  Query query = new Query(kind);
  query.setAncestor(ancestor);
  PreparedQuery pq = datastore.prepare(query);
  return pq.asIterable();
}
公共静态Iterable listChildren(字符串类型,键祖先){
logger.log(Level.INFO,“基于父项搜索实体”);
查询=新查询(种类);
query.set祖先(祖先);
PreparedQuery pq=数据存储。准备(查询);
返回pq.asIterable();
}

希望这有帮助。

因为在
列表子项中,您希望基于祖先查询,所以您的方法是错误的。应该是这样的:

public static Iterable<Entity> listChildren(String kind, Key ancestor) {
  logger.log(Level.INFO, "Search entities based on parent");
  Query query = new Query(kind);
  query.setAncestor(ancestor);
  PreparedQuery pq = datastore.prepare(query);
  return pq.asIterable();
}
公共静态Iterable listChildren(字符串类型,键祖先){
logger.log(Level.INFO,“基于父项搜索实体”);
查询=新查询(种类);
query.set祖先(祖先);
PreparedQuery pq=数据存储。准备(查询);
返回pq.asIterable();
}

希望这有帮助。

我检查过了,还是一样。那不行(当代码逻辑完全相同时,我不明白为什么它适用于一种实体而不适用于另一种实体。你能添加你指定的模型的代码吗?因为可能有一些可疑之处…我对此非常陌生,代码只是来自我修改过的一个示例。我不明白你所说的模型是什么意思。我是adding用于创建或更新profileOrg的另一种方法。所谓模型,我指的是您试图使用此方法查询的类。由于查询是正确的,问题可能在于您构造类的方式。没有。这不起作用。我使用profileOrg来减少数据库的搜索时间,但我知道了我对数据存储写入的数量有限制。所以我现在跳过了这个想法。谢谢你的帮助。我检查过了,还是一样。这不起作用:(当代码逻辑完全相同时,我不明白为什么它适用于一种实体而不适用于另一种实体。你能添加你指定的模型的代码吗?因为可能有一些可疑之处…我对此非常陌生,代码只是来自我修改过的一个示例。我不明白你所说的模型是什么意思。我是adding用于创建或更新profileOrg的另一种方法。所谓模型,我指的是您试图使用此方法查询的类。由于查询是正确的,问题可能在于您构造类的方式。没有。这不起作用。我使用profileOrg来减少数据库的搜索时间,但我知道了我对数据存储写入的数量有限制。所以我现在跳过这个想法。谢谢你的帮助。
Entity Profile = Product.getProfile(profileID);
public static Iterable<Entity> listChildren(String kind, Key ancestor) {
  logger.log(Level.INFO, "Search entities based on parent");
  Query query = new Query(kind);
  query.setAncestor(ancestor);
  PreparedQuery pq = datastore.prepare(query);
  return pq.asIterable();
}