我正在尝试使用此页面https://cloud.google.com/appengine/docs/standard/java/datastore/query-cursors作为灵感来使用GAE游标。 问题是我的代码返回的游标是null - 我不明白为什么,因为我认为我使用与上面链接相同的结构,即查询的结果是QueryResultList,我使用getCursor方法获得对游标的引用的结果。 NON_SENT_MATCHES_LIMIT是20,如果我对查询没有设置限制,则有超过2000个实体,所以我希望结果是非空游标。
有人可以向我解释为什么游标是空的吗?
public ProductRuleMatchWithCursor getNonSentMatchesBatch(Transaction transaction, long shopId, Cursor startCursor) {
Query.FilterPredicate activeOrderProduct = new Query.FilterPredicate(ProductRuleMatchDBFields.ACTIVE, Query.FilterOperator.EQUAL, true);
Query.FilterPredicate pendingOrderProduct = new Query.FilterPredicate(ProductRuleMatchDBFields.MATCH_STATUS, Query.FilterOperator.EQUAL, MatchStatus.PENDING.getId());
Query.FilterPredicate failedOrderProduct = new Query.FilterPredicate(ProductRuleMatchDBFields.MATCH_STATUS, Query.FilterOperator.EQUAL, MatchStatus.FAILED_CAN_RECOVER.getId());
Query query = new Query(ProductRuleMatchDBFields.PRODUCT_RULE_MATCH_TABLE_NAME).setFilter(Query.CompositeFilterOperator.and(activeOrderProduct, Query.CompositeFilterOperator.or(pendingOrderProduct, failedOrderProduct)));
query.setAncestor(KeyFactory.createKey(ShopDBFields.SHOP_TABLE_NAME, shopId));
FetchOptions fetchOptions = FetchOptions.Builder.withLimit(NON_SENT_MATCHES_LIMIT);
if (startCursor != null){
fetchOptions.startCursor(startCursor);
}
QueryResultList<Entity> entities = datastore.prepare(transaction, query).asQueryResultList(fetchOptions);
List<ProductRuleMatch> matches = new ArrayList<>();
for (Entity entity : entities) {
matches.add(createModelFromEntity(entity));
}
Cursor cursor = entities.getCursor();
logger.info("The cursor is: " + cursor);
return new ProductRuleMatchWithCursor(matches, cursor);
}
答案 0 :(得分:0)
好的 - 如果我有点耐心,我会在参考链接的文档中找到答案:
“因为NOT_EQUAL和IN运算符是使用多个查询实现的,所以使用它们的查询不支持游标,也不支持使用CompositeFilterOperator.or方法构造的复合查询。”