Java Google App Engine Datastore: Operador 'IN' acessível em filtros de consulta JDO, como com Python?
-
11-09-2019 - |
Pergunta
Esta página descreve operador de um 'IN' que pode ser usado em GAE Datastore para comparar um campo com uma lista de possíveis correspondências, e não apenas um único valor:
No entanto, este é para Python. Em Java (App Engine 1.2.5), tentando
query.setFilter("someField IN param");
no meu javax.jdo.query dispara um JDOUserException 'Parcela de expressão não pôde ser analisado: IN param'.
Existe uma maneira isso pode ser feito?
Solução
A versão Python de IN
é de fato implementado no código de nível de aplicativo (que você pode examinar desde a sua parte do App Engine SDK open-source): essencialmente, uma consulta com um IN
como a sua torna-se consultas N com ==
(onde N == len (param)) e os resultados dessas consultas N estão de volta mesclada como o resultado global.
Enquanto é sem dúvida conveniente ter essa funcionalidade como parte do código-fonte fornecido pelo Google, não há realmente nenhum valor acrescentado para além desta conveniência e, em particular, não há nenhuma vantagem wrt desempenho apenas fazê-lo em seu próprio código. Então, eu não estou surpreso que esta minor emenda foi (pelo menos até agora) não adicionados à versão Java ...
Outras dicas
Para usar o operador IN, eu uso isso:
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);
}