Domanda

questa domanda ho risolto il problema di interrogare Google archivio dati per recuperare roba dall'utente (com.google.appengine.api.users.User) in questo modo:

User user = userService.getCurrentUser();
String select_query = "select from " + Greeting.class.getName(); 
Query query = pm.newQuery(select_query); 
query.setFilter("author == paramAuthor"); 
query.declareParameters("java.lang.String paramAuthor"); 
greetings = (List<Greeting>) query.execute(user);

È possibile che questo funziona bene - ma dopo un po 'di fare in giro ho capito questa sintassi a non molto pratico, come la necessità di costruire le query più complesse si pone - così ho deciso di costruire manualmente i miei filtri e ora ho per esempio qualcosa come il seguenti (in cui il filtro è solitamente passato come una stringa variabile ma ora è costruito in linea per semplicità):

User user = userService.getCurrentUser();    
String select_query = "select from " + Greeting.class.getName(); 
Query query = pm.newQuery(select_query); 
query.setFilter("author == '"+ user.getEmail() +"'");  
greetings = (List<Greeting>) query.execute();

Ovviamente questo non funzionerà anche se questa sintassi con field = 'value' è sostenuto da JDOQL e funziona bene su altri campi (tipo String e Enums). L'altra cosa strana è che a guardare lo spettatore dati nel cruscotto app-motore il campo 'autore' è memorizzato come tipo utente , ma il valore è 'user@gmail.com', e poi di nuovo quando ho impostato come parametro (il caso di cui sopra, che funziona bene) sto dichiarando il parametro come una stringa poi tramandare un'istanza di utente (utente) che viene serializzato con un semplice toString() (credo).

Chiunque qualche idea?

È stato utile?

Soluzione

Utilizzando sostituzione di stringhe in linguaggi di query è sempre una cattiva idea. E 'fin troppo facile per un utente di uscire e la mensa con l'ambiente, e introduce un'intera collezione di problemi di codifica, ecc.

Ciò che è sbagliato con il precedente approccio sostituzione di parametro? Per quanto io sappia, supporta tutto, ed evita eventuali problemi di analisi. Per quanto riguarda il problema di sapere quanti argomenti da passare va, è possibile utilizzare Query.executeWithMap o Query.executeWithArray per eseguire una query con un numero imprecisato di argomenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top