我正在构造一个复合过滤器,当我为此查询设置排序顺序时,它具有OR运算符和AND过滤运算符,但不能给出正确的结果。
我要执行的查询是{status ==已初始化OR(Status == Failed AND failedCount <= 5)}。它实际上执行查询没有任何错误,但结果不完全正确。它仅检索“状态==失败AND failedCount <= 5”,而不检索状态==已启动。我需要的顺序是“ createdAt”字段。
Filter initiatedFilter = new FilterPredicate("status", FilterOperator.EQUAL, "Initiated");
Filter failedFilter = new FilterPredicate("status", FilterOperator.EQUAL, "Failed");
Filter failedCountFilter = new FilterPredicate("failedCount", FilterOperator.LESS_THAN_OR_EQUAL, 5);
CompositeFilter failedCompositeFilter = CompositeFilterOperator.and(failedFilter, failedCountFilter);
CompositeFilter initaiedFailedFilter = CompositeFilterOperator.or(initiatedFilter, failedCompositeFilter);
Query query2 = new Query("JobInstance").setFilter(initaiedFailedFilter).addSort("failedCount", SortDirection.ASCENDING).addSort("createdAt", SortDirection.ASCENDING);
jobEntitesList = datastoreService.prepare(query2).asList(FetchOptions.Builder.withLimit(limit));
for (Entity jobEntity2 : jobEntitesList) {
/* doing some task */
}
我观察到的是,如果删除addSort(),它的工作正常。但是对我来说,排序很重要。我希望结果应为“ createdAt”顺序。如果我删除failCount,则会抛出一些错误。
答案 0 :(得分:1)
或者过滤器完全在客户端中实现(例如IN查询过滤器:https://cloud.google.com/appengine/docs/standard/java/datastore/queries#filters)。因此,您的排序正在客户端中进行。您有可能先从status == Failed AND FailedCount <= 5
查询中获取所有结果,然后再从status == Initiated
中获取任何结果。
根据您的评论,目前尚不清楚您要查找的排序顺序。如Restrictions on queries中所述,主要排序顺序必须位于failCount上,因为它具有不等式过滤器。