第一个排序属性必须与应用不等式过滤器的属性相同

时间:2013-07-31 11:41:25

标签: java google-app-engine nosql google-cloud-datastore

  

java.lang.IllegalArgumentException:第一个排序属性必须是   与应用不等式过滤器的属性相同。   在您的查询中,第一个排序属性是投票但不平等   过滤器在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));

上面的代码试图根据其类别和过去24小时内创建的人员重新检查Post实体列表。然后根据他们有多少票来对它们进行排序。它也有限制和抵消分页。

2 个答案:

答案 0 :(得分:2)

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

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

但是这将有一个限制,即结果将无法根据您的第二个属性进行正确排序,因此您将在客户端进行其他排序。请阅读此earlier post以了解此行为

答案 1 :(得分:1)

当您应用不等式过滤器(在您的情况下为GreaterThan)时,您必须首先应用用于过滤器的相同字段。

如果你有

Filter createdDateFilter = new FilterPredicate("createdDate", FilterOperator.GREATER_THAN, timeAgo);

然后你必须先为同一个字段订购

.addSort("createdDate", SortDirection.ASCENDING)

稍后您可以应用其他类别,例如

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