5

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 实体获取列表。然后按他们有多少票对他们进行排序。它也有分页的限制和偏移。

4

2 回答 2

3

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

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

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

于 2013-07-31T12:00:09.560 回答
1

当您应用不等式过滤器(在您的情况下为 GreaterThan)时,您必须应用用于过滤器的相同字段作为第一次排序。

如果你有

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

然后你必须先为同一个领域订购

.addSort("createdDate", SortDirection.ASCENDING)

之后,您可以应用其他类型,例如

.addSort("createdDate", SortDirection.ASCENDING)
.addSort("vote", SortDirection.DESCENDING);
于 2013-07-31T17:16:31.593 回答