1

我有此代码来检查数据存储中是否已存在子实体。问题是它适用于一个父子关系,但总是为另一个关系返回 null。

我的应用中有四种实体 - ORG、Contact、Profile、ProfileOrg。联系人类型实体是 ORG 的子级,而 ProfileOrg 是 Profile 的子级。将联系人添加到 ORG 的逻辑是获取给定组织的所有子实体,然后检查属性。如果属性匹配,则返回实体,否则返回 null。这非常适用于 ORG-Contact 关系。但 Profile-ProfileOrg 关系的完全相同的逻辑不起作用。它总是返回 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;
}

这是查询数据存储的代码。

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);
  query.addFilter(Entity.KEY_RESERVED_PROPERTY, FilterOperator.GREATER_THAN, ancestor);
  PreparedQuery pq = datastore.prepare(query);
  return pq.asIterable();
}

请帮忙。这让我陷入了困境。

编辑:为 org 获取 ChildEntities 的代码,效果很好

public static Entity getSingleContact(Key orgKey, String phoneContactID) {
    Iterable<Entity> childContacts = Util.listChildren("contact", orgKey);


    for (Entity e : childContacts) {
        if (e.getProperty("contactID") == phoneContactID) {
            return e;
        }
    }
    return null;
}

编辑:创建或更新 ProfileOrg 的代码

public static void createOrUpdateProfileOrg(String profileID,
        String orgName, String ownerID) {
    String orgID = ownerID + "_" + orgName;
    Entity Profile = Product.getProfile(profileID);
    //Key profileKey = KeyFactory.createKey("Profile", profileID);
    Key profileKey = Profile.getKey();
    Entity profileOrg = getSingleProfileOrg(profileKey, orgID);
    if (profileOrg == null) {
        profileOrg = new Entity("profileOrg", profileKey);
        profileOrg.setProperty("name", orgName);
        profileOrg.setProperty("orgID", orgID);
        profileOrg.setProperty("owner", ownerID);
        profileOrg.setProperty("profileID", profileID);
        Util.persistEntity(profileOrg);
    }

}

线

Entity Profile = Product.getProfile(profileID);

应该可以正常工作,因为它也用于创建配置文件,我没有看到任何问题。

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

4

1 回答 1

1

由于在 中listChildren,您想基于祖先进行查询,因此您的方法是错误的。它应该是这样的:

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();
}

希望这可以帮助。

于 2012-10-20T06:58:15.173 回答