Question

cette question je résolu le problème de Google interrogation Datastore pour récupérer des choses par l'utilisateur (com.google.appengine.api.users.User) comme ceci:

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);

Les travaux ci-dessus très bien - mais après un peu de déconner j'ai réalisé cette syntaxe dans pas très pratique que la nécessité de construire des requêtes plus complexes se pose - alors j'ai décidé de construire manuellement mes filtres et maintenant je suis par exemple quelque chose comme suivant (où le filtre est habituellement transmis comme une variable de chaîne, mais est maintenant construit en ligne pour simplifier):

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();

Il est évident que cela ne fonctionnera pas, même si cette syntaxe avec field = 'value' est soutenu par JDOQL et il fonctionne très bien sur d'autres domaines (types de cordes et énumérations). L'autre chose étrange est que regarder le spectateur de données dans le tableau de bord app-moteur le champ « auteur » est stocké en tant que type Utilisateur mais la valeur est « user@gmail.com », puis à nouveau lorsque Je l'ai mis comme paramètre (le cas ci-dessus qui fonctionne très bien) Je déclare le paramètre comme une chaîne puis voguant sur une instance de l'utilisateur (l'utilisateur) qui obtient sérialisé avec un simple toString() (je suppose).

Quelqu'un une idée?

Était-ce utile?

La solution

Utiliser la substitution de chaîne dans les langages de requête est toujours une mauvaise idée. Il est beaucoup trop facile pour un utilisateur de sortir et le désordre avec votre environnement, et il introduit toute une collection de problèmes de codage, etc.

Quel était le problème avec votre approche de substitution des paramètres plus tôt? Pour autant que je sache, il supporte tout, et il évite tout problème d'analyse syntaxique. En ce qui concerne le problème de savoir combien d'arguments pour passer GOES, vous pouvez utiliser Query.executeWithMap ou Query.executeWithArray pour exécuter une requête avec un nombre inconnu d'arguments.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top