2017-09-01 5 views
0

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); 
} 

Répondre

0

Ahh ok - si j'avais été un peu plus patient, je l'aurais trouvé la réponse dans la documentation dans le lien référencé:

« Parce que la NOT_EQUAL et IN sont mis en œuvre avec plusieurs requêtes, les requêtes ceux qui les utilisent ne prennent pas en charge les curseurs, ni les requêtes composites construites avec la méthode CompositeFilterOperator.or. "

+0

Mais que faites-vous alors, si vous avez une requête avec un CompositeFilterOperator.or et que vous avez besoin de curseurs? – Lull