2011-01-22 7 views
0

Vous avez une entité A avec comme celui-ciJDO Interroge avec OR dans GAE

public class A 
private String a; 
private String b; 
.. 
.. 
.. 

Comment puis-je écrire une requête JDO que sélectionner tous les objets A qui correspond soit à un mot-clé == == OU mot-clé b

code complet ressemble à ceci:

Query q = pm.newQuery(SELECT FROM A WHERE a == keyword || b == keyword ORDER BY date DESC"); 

     List<A> results = (List<A>)q.execute(keyword); 

ce code ne donne aucune erreur, mais ne donne aucun résultat. Supprimer le || la partie donne des résultats.

Merci

Répondre

2

Vous ne pouvez pas faire une ou sur deux champs différents. Voici un extrait de la docs:

Dans la syntaxe de chaîne JDOQL, vous pouvez plusieurs filtres séparés avec || (logique "ou") et & & (logique "et"), mais gardez à l'esprit que || peut seulement être utilisé lorsque les filtres sépare tous ont le même champ nom. En d'autres termes, || est que juridique dans des situations où les filtres il sépare peuvent être combinés en un seul contient() Filtre:

// legal, all filters separated by || are on the same field 
Query query = pm.newQuery(Employee.class, 
          "(lastName == 'Smith' || lastName == 'Jones')" + 
          " && firstName == 'Harold'"); 

// not legal, filters separated by || are on different fields 
Query query = pm.newQuery(Employee.class, 
          "lastName == 'Smith' || firstName == 'Harold'"); 

Une façon de contourner cela pourrait être pour stocker votre a et b dans une liste. Si vous avez une liste d'éléments appelés foo, vous pouvez faire une requête où foo = mot-clé, et si un élément de foo correspond, vous obtiendrez cet objet dans vos résultats. Vous ne dites pas beaucoup sur ce a et b sont, donc je ne sais pas si cela fonctionnera pour vous ou pas :)

Mise à jour:

public class Example { 
    String firstName; 
    String lastName; 
    List<String> allNames; 

    public Example(String first, String last){ 
     firstName = first; 
     lastName = last; 
     allNames = new ArrayList<String>(); 
     allNames.add(first); 
     allNames.add(last); 
    } 
} 

Avec quelque chose comme ça, vous pourrait alors faire une requête où "allNames == 'Smith' || allNames == 'Jones'".

+0

Salut merci pour votre commentaire. Je ne suis pas sûr de suivre la liste, a et b sont des chaînes et le mot clé que je veux correspondre. Je veux faire exactement comme l'exemple illégal, est-ce possible avec votre solution et à quoi cela ressemblerait-il? –

+1

J'ai ajouté un exemple à ma réponse. –

Questions connexes