Java Google App Engine datastore: operatore 'IN' accessibile filtri di query JDO, come con Python?
-
11-09-2019 - |
Domanda
Questa pagina descrive un operatore 'IN' che può essere utilizzato in GAE Datastore per confrontare un campo con un elenco di possibili corrispondenze, non solo un singolo valore:
Tuttavia questo è per Python. In Java (App Engine 1.2.5), cercando
query.setFilter("someField IN param");
sul mio javax.jdo.query spara un JDOUserException 'Porzione di espressione non potrebbe essere analizzato: IN param'.
C'è un modo questo può essere fatto?
Soluzione
La versione di Python di IN
è effettivamente implementata in codice a livello di applicazione (che è possibile esaminare in quanto fa parte di App Engine SDK open source): in sostanza, una query con un IN
come la tua diventa query N con ==
(dove N == len (param)) ed i risultati di quelle query N sono fuse indietro come il risultato complessivo.
Mentre è senza dubbio conveniente avere questa funzionalità come parte del codice sorgente fornito da Google, non c'è davvero alcun valore aggiunto al di là di questo vantaggio, e, in particolare, non v'è alcun vantaggio prestazionale WRT solo facendo nel proprio codice. Quindi, non mi stupisce che questo tweak minore è (almeno finora) non aggiunti alla versione Java ...
Altri suggerimenti
Per usare l'operatore IN, io uso questo:
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);
}