1

子エンティティがデータストアにすでに存在するかどうかを確認するためのこのコードがあります。問題は、ある親子関係では機能しますが、別の関係では常にnullを返すことです。

アプリには、ORG、Contact、Profile、ProfileOrgの4種類のエンティティがあります。連絡先の種類のエンティティは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();
}

助けてください。これは私を立ち往生させました。

編集:完全に機能する組織の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);からnullを取得します。子エンティティが重複することになります。

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 に答える