子エンティティがデータストアにすでに存在するかどうかを確認するためのこのコードがあります。問題は、ある親子関係では機能しますが、別の関係では常に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を取得します。子エンティティが重複することになります。