如何通过使用jpa查询GAE数据存储中的子项来获取父实体?

时间:2014-05-14 04:41:16

标签: java google-app-engine jpa google-cloud-datastore google-cloud-endpoints

在Google应用引擎数据存储中,我有3步实体层次结构。这三个实体是..

Department(Parent Entity) 
-Id
-Department Name
-list of Employee(@OneToMany) 

Employee(Child of Department)  
-key
-firstName
-lastName
-phoneNumber
-list of Address(@OneToMany) 

Address(Child of Employee)
-key
-city
-pincode

如果我需要检索具有各自地址的特定城市的所有员工,我应该创建哪些实体?使用我现有的数据存储区设计,我需要查询n次以检索n个员工的地址,这完全不可取。 请告知我如何设计我的数据存储区实体,以便我可以将所有员工的地址详细信息检索到一个或两个查询。

感谢任何帮助。提前谢谢!

1 个答案:

答案 0 :(得分:3)

如果您只需要根据其所在城市查询员工,则可以在List<String>课程中添加Employee个城市。这样您就可以运行SELECT e FROM Employee e WHERE :cityQueried IN e.cities

之类的查询

您必须保持城市和地址之间的同步。

public class Employee {
   @Id
   private Key key;
   @Basic
   private String firstName;
   @Basic
   private String lastName;

   @OneToMany
   private List<Address> addresses;

   @Basic
   private List<String> cities;

   /**
    * Same goes for removeAddress...
    */
   public void addAddress(Address address) {
      addresses.add(address);
      cities.add(address.city);
   }
}

编辑:

不幸的是,如果要查询实体,则必须在其自己的属性和/或其祖先(父)上执行此操作。

如果您的员工只有有限数量的地址,则另一种解决方案是直接在Employee实体上存储地址属性:

public class Employee {
   @Id
   private Key key;
   @Basic
   private String firstName;
   @Basic
   private String lastName;

   @Basic
   private String address1City;
   @Basic
   private String address1ZipCode;

   @Basic
   private String address2City;
   @Basic 
   private String address2ZipCode;
}

这里没有奇迹