2010-03-18 14 views
3

J'ai environ 50 000 entités stockées dans appengine. Je suis en mesure de rechercher un enregistrement individuel via l'interface admin GQL avec une requête comme:Comment faire une requête de recherche de clé Google DataStore par lots dans JDO

SELECT * FROM Pet where __key__ = KEY('Pet','Fido') 

Mais je vais avoir du mal à comprendre comment faire une version de traitement par lots de ce via JDO. En ce moment, j'ai ceci:

PersistenceManager pm = ...; 
    for(Pet pet : pets) { 
     for(String k : getAllAliases(pet)) { 
      keys.add(KeyFactory.createKeyString(Pet.class.getSimpleName(), k)); 
     } 
    } 
    Query q = pm.newQuery("select from " + Pet.class.getName() + " where id == :keys"); 
    List<Pet> petlist = (List<Pet>) q.execute(keys); 

Mais si les œuvres « Fido » dans le cas GQL, il ne renvoie rien quand j'utilise ce code Java + JDO. Qu'est-ce que je fais mal?

Répondre

1

ne fonctionnera probablement pas dans le cas JDOQL car il n'est pas valide JDOQL :-P

 
Collection keys = ... (create your keys collection) 
Query q = pm.newQuery("SELECT FROM " + Pet.class.getName() + " WHERE :keys.contains(id)"); 

-à-dire le filtre utilise Java syntaxe

+0

Bon à savoir. Je m'attendais à recevoir une sorte de notification d'erreur difficile à ignorer si la requête n'était pas valide, alors je suis déçu. – TheDon

2

Ne pas utiliser des requêtes pour récupérer des entités par clé - ils sont inefficaces, et nécessitent une requête pour chaque objet récupéré! Au lieu de cela, get the objects by key. Les extractions en vrac par clé ne semblent pas être prises en charge par JDO, mais les récupérer par clé une à la fois sera toujours beaucoup plus efficace que de faire des requêtes pour elles.

+0

J'ai du mal à croire que récupérer des entités - de manière synchrone - individuellement par clé soit plus rapide que de faire une requête JDO. Je vais essayer l'expérience à un moment donné. – TheDon

+2

'IN' n'est pas supporté nativement par App Engine - le SDK l'émule en exécutant plusieurs requêtes séquentielles. Chaque requête doit effectuer une analyse d'index suivie d'une recherche par clé. En comparaison, une recherche par clé n'a qu'une petite partie à faire, donc c'est beaucoup plus rapide. –

Questions connexes