J'essaie d'utiliser les curseurs GAE en utilisant cette page https://cloud.google.com/appengine/docs/standard/java/datastore/query-cursors comme source d'inspiration. Le problème est que le curseur renvoyé par mon code ci-dessous est null - Je ne comprends pas pourquoi, car je pense utiliser la même structure que le lien ci-dessus, ie le résultat de la requête est QueryResultList et j'utilise la méthode getCursor sur le résultat pour obtenir une référence au curseur. Le paramètre NON_SENT_MATCHES_LIMIT a la valeur 20 et si je ne mets aucune limite à la requête, il y a plus de 2 000 entités, donc j'attendrais un curseur non nul en résultat.Pourquoi le curseur est-il renvoyé par ma requête de banque de données GAE null?
Quelqu'un peut-il m'expliquer pourquoi le curseur est nul?
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);
}
Mais que faites-vous alors, si vous avez une requête avec un CompositeFilterOperator.or et que vous avez besoin de curseurs? – Lull