【问题标题】:How to get entity of parent by querying on child in GAE data-store using jpa?如何通过使用 jpa 在 GAE 数据存储中查询子级来获取父级实体?
【发布时间】:2014-05-14 04:41:15
【问题描述】:

在 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 员工的地址,这根本不可取。 请告知我如何设计我的数据存储实体,以便我可以在一个或两个查询中检索所有员工及其地址详细信息。

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

【问题讨论】:

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


    【解决方案1】:

    如果您只需要根据城市查询员工,您可以在您的 Employee 类中添加城市的 List<String>。这样你就可以运行类似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;
    }
    

    这里也没有奇迹

    【讨论】:

    • 感谢迈克尔的回复。但我不明白 :cityQueried 是什么意思。请你解释一下。如果我想根据密码进行查询,还有其他方法吗?我需要在员工中为 pincode 创建另一个字段吗?请指教..
    • 这是一个 JPA 查询参数。我的查询是伪代码,目的是提示您如何查询“与cityQueried 相关的员工”,例如:SELECT e FROM Employee e WHERE :theCityYouAreSearchingFor IN e.cities。同样,我没有检查,也许 JPA 语法看起来更像SELECT e FROM Employee e WHERE e.cities CONTAINS :theCityYouAreSearchingFor
    • 感谢 Michale 的简短回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多