Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用数据存储api对子实体进行排序_Java_Google App Engine_Google Cloud Datastore - Fatal编程技术网

Java 如何使用数据存储api对子实体进行排序

Java 如何使用数据存储api对子实体进行排序,java,google-app-engine,google-cloud-datastore,Java,Google App Engine,Google Cloud Datastore,在这里,我使用数据存储API创建、更新和检索实体 我的用例是,必须获得父实体的子实体和孙子实体 我的实体结构如下: Company --> Employee --> Address (Multiple Address entities). DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); Query query = new Query().se

在这里,我使用数据存储API创建、更新和检索实体

我的用例是,必须获得父实体的子实体和孙子实体

我的实体结构如下:

 Company
     --> Employee
            --> Address (Multiple Address entities).
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();

Query query = new Query().setAncestor(companyKey);
datastore.prepare(query).asList(FetchOptions.Builder.withDefaults());
 java.lang.IllegalArgumentException: kind is required for all orders except __key__ ascending
at com.google.appengine.api.datastore.DatastoreApiHelper.translateError(DatastoreApiHelper.java:50)
at com.google.appengine.api.datastore.DatastoreApiHelper$1.convertException(DatastoreApiHelper.java:121)
这里我有
公司
实体密钥,我需要获取
员工
详细信息以及为员工配置的所有
地址
实体

例如:

Company --> Aaa
     Employee --> John 
                  Address --> California
                  Address --> Redwood
     Employee --> Robert
                  Address --> New York
                  Address --> Washington
我的要求是:

  • John&Robert的员工实体以及相应的
    地址
    实体

  • 员工实体应按名称排序

  • 我的质询如下:

     Company
         --> Employee
                --> Address (Multiple Address entities).
    
    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
    
    Query query = new Query().setAncestor(companyKey);
    datastore.prepare(query).asList(FetchOptions.Builder.withDefaults());
    
     java.lang.IllegalArgumentException: kind is required for all orders except __key__ ascending
    at com.google.appengine.api.datastore.DatastoreApiHelper.translateError(DatastoreApiHelper.java:50)
    at com.google.appengine.api.datastore.DatastoreApiHelper$1.convertException(DatastoreApiHelper.java:121)
    
    上述查询返回#1中指定的结果

    但无法使用此查询按名称对
    员工
    实体进行排序。 当我试图添加sort子句
    query.addSort(“name”,SortDirection.ASCENDING)
    时,它抛出一个错误,如下所示:

     Company
         --> Employee
                --> Address (Multiple Address entities).
    
    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
    
    Query query = new Query().setAncestor(companyKey);
    datastore.prepare(query).asList(FetchOptions.Builder.withDefaults());
    
     java.lang.IllegalArgumentException: kind is required for all orders except __key__ ascending
    at com.google.appengine.api.datastore.DatastoreApiHelper.translateError(DatastoreApiHelper.java:50)
    at com.google.appengine.api.datastore.DatastoreApiHelper$1.convertException(DatastoreApiHelper.java:121)
    

    在查询中使用祖先路径时如何对子实体进行排序?

    您的查询被视为Kindless查询,因为您没有查询特定种类(例如地址或员工)。您只是说,获取所有具有指定祖先的实体。Kindless查询只能按键进行排序(
    \uuuuuuuuuuuuuuuuuuuuuuuuuu
    )。不支持其他属性

    缔约国指出——

    Kindless查询

    没有种类和祖先的查询检索 来自云数据存储的应用程序。这种没有Kindles的查询无法实现 包括属性值的过滤器或排序顺序。但是他们可以,, 过滤实体键并使用祖先过滤器。密钥筛选器可以是 通过指定作为属性名使用:

    您可能希望研究修改模型,将地址作为嵌入列表存储到Empoyee实体中,看看这样是否更有效