Java Google App Engine almacén de datos: operador 'IN' disponible en filtros de consulta JDO, como con Python?
-
11-09-2019 - |
Pregunta
Esta página describe un operador 'IN' que se puede utilizar en GAE almacén de datos para comparar un campo con una lista de posibles coincidencias, no sólo un único valor:
Sin embargo, esto es para Python. En Java (App Engine 1.2.5), tratando
query.setFilter("someField IN param");
en mi javax.jdo.query dispara un JDOUserException 'Porción de expresión no se pudo analizar: EN parámetro'.
¿Hay alguna manera esto se puede hacer?
Solución
La versión de Python de IN
se llevan a la práctica el código de nivel de aplicación (que puede examinar, ya que es parte de la App Engine SDK de código abierto): en esencia, una consulta con una IN
como la suya se convierte en N consultas con ==
(donde N == len (param)) y los resultados de las consultas N se fusionan de nuevo como el resultado global.
Si bien es discutible conveniente tener esta funcionalidad como parte del código fuente proporcionado por Google, no hay realmente ningún valor añadido más allá de esta ventaja, y en particular, no hay ninguna ventaja de rendimiento WRT sólo lo hace en su propio código. Por lo tanto, no me sorprende que este pequeño ajuste era (al menos hasta ahora) no se añade a la versión Java ...
Otros consejos
Para utilizar el operador IN, yo uso esto:
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);
}