Java Google App Engine Datastore: Operador 'IN' acessível em filtros de consulta JDO, como com Python?

StackOverflow https://stackoverflow.com/questions/1448677

  •  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?

Foi útil?

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);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top