2009-09-19 9 views
0

This page décrit un opérateur « IN » qui peut être utilisé dans GAE Datastore pour comparer un champ à une liste de correspondances possibles, et pas seulement une seule valeur:Banque de données Google App Engine Java: opérateur 'IN' disponible sur les filtres de requête JDO, comme avec Python?

Cependant ceci est pour Python. Dans Java (App Engine 1.2.5), en essayant

query.setFilter("someField IN param"); 

sur mon javax.jdo.query tire un JDOUserException 'portion d'expression ne pouvait être analysée: IN param.

Y a-t-il un moyen de le faire?

+0

Ce qui est invalide JDOQL. Suggère que vous lisiez la spécification JDO, ou les docs GAE/J pour la syntaxe de requête ... en particulier "contains()" comme ci-dessous – DataNucleus

Répondre

1

La version Python de IN est effectivement mis en œuvre dans le code niveau de l'application (que vous pouvez examiner, car il fait partie de l'App Engine SDK open source): essentiellement, une requête avec un IN comme la vôtre devient requêtes N avec == (où N == len (param)) et les résultats de ces N requêtes sont fusionnés en tant que résultat global. Bien qu'il soit sans doute pratique d'avoir cette fonctionnalité dans le cadre du code source fourni par Google, il n'y a vraiment aucune valeur ajoutée au-delà de cette commodité, et en particulier il n'y a aucun avantage de performance à faire dans votre propre code. Donc, je ne suis pas surpris que ce tweak mineur était (au moins jusqu'à présent) pas ajouté à la version Java ...

2

Pour utiliser l'opérateur IN, j'utilise ceci:

List<Site> query(List<String> searchTerms) 
{ 
    javax.jdo.Query q = pm.newQuery(Site.class); 
    q.setFilter("param.contains(siteField)"); 
    q.declareParameters("java.util.Collection param"); 
    return (List<Site>)q.execute(searchTerms); 
} 
Questions connexes