2010-09-21 14 views
1

J'utilise Google App Engine pour un projet et j'ai besoin de faire quelques requêtes sur la base de données. J'utilise le JDOQL pour demander la base de données. Dans mon cas, je veux obtenir l'université qui contient la sous-chaîne "tableau". Je pense que ma requête comporte une erreur car elle renvoie le nom des universités dans l'ordre alphabétique et non celui contenant la sous-chaîne.Problème avec JDOQL pour obtenir des résultats avec une demande "contient"

Query query = pm.newQuery("SELECT FROM " + University.class.getName() + " WHERE name.contains("+array+") ORDER BY name RANGE 0, 5"); 

Quelqu'un pourrait me dire ce qui ne va pas dans ma requête?

Nous vous remercions de votre aide!

EDIT

J'ai une liste des universités magasin et j'ai un suggestbox où l'on peut demander une université par son nom. Et je veux autocomplete le nom demandé.

Répondre

1

App Engine ne prend pas en charge complète recherches de texte, vous devez commencer par le problème 217. Cependant, une solution de contournement partielle est possible. Et dans votre cas, je pense que c'est un bon ajustement. Tout d'abord, ajustez votre modèle de sorte qu'il existe une version inférieure (ou majuscule) du nom - je suppose qu'il s'appelle lname. Sauf si vous voulez que vos requêtes soient sensibles à la casse.

Ensuite, vous requête comme ceci:

Query query = pm.newQuery(University.class); 
query.setFilter("lname >= startNameParam"); 
query.setFilter("lname < stopNameParam"); 
query.setOrdering("lname asc"); 
query.declareParameters("String startNameParam"); 
query.declareParameters("String stopNameParam"); 
query.setRange(0, 5); 
List<University> results = (List<University>) query.execute(search_value, search_value + "z"); 
0

La bonne façon de le faire est comme ça -

Query query = pm.newQuery(University.class,":p.contains(name)"); 
query.setOrdering("name asc"); 
query.setRange(0, 5); 
List univs = q.execute(Arrays.asList(array)); 

(note- Dans ce cas, le :p est un implicit param nom que vous pouvez remplacer par un nom)

+0

Vous pouvez le remplacer par un nom aléatoire par exemple ":Michael". S'il n'y a qu'un seul paramètre dans la requête, vous n'avez pas besoin de le déclarer et votre 'tableau' sera considéré à la place de ce paramètre. voir 'paramètres implicites' dans le lien que j'ai mis dans ma réponse. – Gopi

+0

Cela ne fonctionne pas si array est une sous-chaîne d'un nom d'université. Par exemple, si array = 'Harv', il ne retournera rien, mais si array est exactement égal au nom d'une université stockée dans la DB, cela fonctionnera. Si array = 'Harvard University' cela fonctionne ... –

+0

oui. Je ne pense pas qu'il y ait un moyen dans l'app-engine pour rechercher la sous-chaîne ou quelque chose comme un 'LIKE' dans sql. – Gopi