2010-07-30 6 views
3

Je souhaite sélectionner une liste de résultats dans une base de données, mais l'opérateur == pour les requêtes JDO est sensible à la casse. Est-il possible de sélectionner "USER", "user" et "User" à partir d'une table en utilisant un seul paramètre?Ignorer le cas dans la requête JDO

En MySQL vous avez l'opérateur LIKE, et en Java la fonction equalsIgnoreCase. Cependant, aucun d'eux ne fonctionne dans cet exemple.

PersistenceManager pm = JDO.factory.getPersistenceManager(); 

Query query = pm.newQuery(User.class, "username == usernameParam"); 
query.declareParameters("String usernameParam"); 

List<User> results = (List<User>) query.execute(username); 

Répondre

4

JDOQL dispose de méthodes String disponibles. Consultez la documentation here.

Pour résoudre votre problème, vous pouvez effectuer les opérations suivantes:

PersistenceManager pm = JDO.factory.getPersistenceManager(); 

Query query = pm.newQuery(User.class, "username.toUpperCase() == usernameParam"); 
query.declareParameters("String usernameParam"); 

List<User> results = (List<User>) query.execute(username.toUpperCase()); 
+0

Dans le moteur d'application, je reçois une "fonction de banque de données non prise en charge" pour cela :( – JohnIdol

5

Vous devez stocker une copie de votre champ en cas de manière insensible - minuscules, par exemple, si un « cas de collation » est mieux si elle est disponible. Ensuite, interrogez-vous sur cela.

La raison en est qu'il n'y a aucun moyen de rechercher efficacement un index régulier d'une manière insensible à la casse.

+0

Wow, vraiment? Cela ressemble à une solution inefficace et sujette aux erreurs. J'ai trouvé la méthode toLowerCase() sur http://www.jpox.org/docs/1_2/jdo/jdoql_methods.html afin que je puisse interroger 'toLowerCase (username) == toLowerCase (usernameParam)'. Cela semble un peu inefficace et pas très élégant, mais cela pourrait fonctionner. – Vortico

+2

C'est exactement le contraire de inefficace. La comparaison de chaque entrée de la base de données à votre requête, ce que fera l'une ou l'autre des approches mentionnées dans votre question, est inefficace. toLowerCase() sur le champ ne fonctionnera pas pour la même raison. –

+0

Cela signifie-t-il que si je dois faire en sorte que le texte soit stocké de manière sensible à la casse, le seul moyen de créer un autre champ et de répliquer le texte .toLowerCase? – JohnIdol

Questions connexes