Bonjour les gars, j'ai des problèmes avec des correspondances exactes en faisant un NamedQuery.JAVA: Problème de chaîne NamedQuery
J'utilise actuellement quelque chose comme ceci:
@NamedQuery(name = MyClass.GET_ENTRY_BY_NAME, query = "select e from Entry e where e.name =:"+ Entry.NAME)
...
Query query = em.createNamedQuery(MyClass.GET_ENTRY_BY_NAME);
query.setParameter(Entry.NAME, myEntry.getName());
Il travaille pour la plupart des cas, mais je remarquai que dans le cas où l'utilisateur passe le nom de fichier avec un espace à la fin, l'namedQuery ignore ce caractère. Par exemple:
Query query = em.createNamedQuery(MyClass.GET_ENTRY_BY_NAME);
query.setParameter(Entry.NAME, myEntry.getName()+ " ");
Renvoie le même résultat que la requête précédente. Contournement de ma validation 'entry valide'. En d'autres termes, j'aimerais que la requête ne retourne aucune entrée et traite l'erreur plus tard.
Une solution que je pouvais penser, est de mettre des guillemets simples autour de mon paramètre dans la namedQuery, comme ceci:
@NamedQuery(name = MyClass.GET_ENTRY_BY_NAME, query = "select e from entry e where e.name =':"+ Entry.NAME "'")
Cependant, il plantera mon code dans le cas où la chaîne contient des guillemets simples en elle ..
Des idées les gars?
Salut axtavt, merci pour la rapidité de la réponse! Eh bien, ma base de données est définie sur VARCHAR. Mais je ne suis pas sûr si la version MySql a quelque chose à voir avec ce problème. J'ai également pensé à faire quelques ajustements avant de définir le paramètre pour la requête, mais je voulais que le logiciel renvoie une erreur pour tout ce qui est différent de la base de données, assurant que l'utilisateur saisit exactement ce qu'il voulait. –
@flavio: Je ne suis pas familier avec MySQL, donc je ne peux rien dire sur ses fonctionnalités. Notez également que mon exemple de requête tronque la valeur stockée, pas le paramètre, de sorte que le résultat doit être exact. – axtavt
J'ai débogué le code en vérifiant le processus de construction de la requête ... Avec le code que vous avez fourni, il semble que le problème soit dans mySql. J'ai remarqué que les deux paramètres et l'entrée de la base de données sont différents ... cependant pour une force divine mystique inconnue, MySql ne fait que tronquer les espaces et les considérer exactement comme des allumettes ... Maintenant, je pense avoir des recherches à faire pour voir si c'est vraiment un comportement attendu MySql ou il y a quelque chose d'autre derrière. Pour l'instant, je pense que je vais devoir faire des vérifications supplémentaires. Merci! –