Java 第一个排序属性必须与应用不等式筛选器的属性相同

Java 第一个排序属性必须与应用不等式筛选器的属性相同,java,google-app-engine,nosql,google-cloud-datastore,Java,Google App Engine,Nosql,Google Cloud Datastore,java.lang.IllegalArgumentException:第一个排序属性必须为 与应用不等式过滤器的属性相同。 在您的查询中,第一个排序属性是vote,但它是不等式 筛选器位于createdDate上 当我尝试运行下面的代码时,我遇到了这个错误。有解决这个问题的办法吗 Query query = new Query("Post"); long timeAgo = now - timeLimit; Filter categoryFilter = new FilterPredicate

java.lang.IllegalArgumentException:第一个排序属性必须为 与应用不等式过滤器的属性相同。 在您的查询中,第一个排序属性是vote,但它是不等式 筛选器位于createdDate上

当我尝试运行下面的代码时,我遇到了这个错误。有解决这个问题的办法吗

Query query = new Query("Post");

long timeAgo = now - timeLimit;
Filter categoryFilter = new FilterPredicate("postCategory", FilterOperator.EQUAL, category);
Filter createdDateFilter = new FilterPredicate("createdDate", FilterOperator.GREATER_THAN, timeAgo);
Filter compositeFilter = CompositeFilterOperator.and(categoryFilter, createdDateFilter);
query.setFilter(compositeFilter);

query.addSort("vote", SortDirection.DESCENDING);

List<Entity> postsEntityList = datastore.prepare(query).asList(FetchOptions.Builder.withOffset(offset).limit(limit));
Query Query=新查询(“Post”);
很久以前=现在-时间限制;
过滤器类别过滤器=新过滤器预测(“后分类”,FilterOperator.EQUAL,category);
Filter createdDataFilter=new FilterPredicate(“createdDate”,FilterOperator.GREATER\u THAN,timeAgo);
Filter compositeFilter=CompositeFilterOperator.and(categoryFilter,CreatedDataFilter);
query.setFilter(compositeFilter);
query.addSort(“投票”,SortDirection.DESCENDING);
List postsEntityList=datastore.prepare(query).asList(FetchOptions.Builder.withOffset(offset.limit(limit));

上面的代码试图根据帖子的类别以及在过去24小时内创建的帖子实体来检索帖子实体的列表。然后根据他们的票数对他们进行排序。它还具有分页的限制和偏移量。

为避免此错误,您唯一的选择是添加多个排序顺序,如下所示,并将createdDate作为第一个排序顺序:

.addSort("createdDate", SortDirection.ASCENDING)
                .addSort("vote", SortDirection.DESCENDING);

但是,这将有一个限制,即结果不会根据您的第二个属性进行正确排序,因此您必须在客户端进行额外排序。请阅读此内容以了解此行为

当您应用不平等过滤器(比您的情况更大)时,您必须应用与过滤器相同的字段作为第一个排序

如果你有

Filter createdDateFilter = new FilterPredicate("createdDate", FilterOperator.GREATER_THAN, timeAgo);
然后,您必须先订购同一字段

.addSort("createdDate", SortDirection.ASCENDING)
之后,您可以应用其他排序,例如

.addSort("createdDate", SortDirection.ASCENDING)
.addSort("vote", SortDirection.DESCENDING);