Question

Bonjour les gars, je suis quelques problèmes avec les correspondances exactes tout en faisant un NamedQuery.

Je suis actuellement en utilisant 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 fonctionne pour la plupart des cas, mais je remarque 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()+ " ");

Est-ce le même résultat que la requête avant. Ma validation court-circuitant "d'entrée valide. Autrement dit, je voudrais la requête pour renvoyer pas d'entrée du tout et traiter 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 dans ce ...

Les gars idées?

Était-ce utile?

La solution 2

Je l'ai fait des recherches dans JPA et a découvert qu'il fait un peu détourage automatique pour Chars, je ne suis pas sûr que cela se comporte avec des chaînes, mais comme il me arrive ... Je crois que oui. La seule façon de le contourner est en définissant un attribut dans l'objet DatabaseLogin de session (voir http://www.eclipse.org/eclipselink/api/1.1/org/eclipse/persistence/sessions/DatabaseLogin.html#setShouldTrimStrings ).

Eh bien, je ne voulais pas être déconner avec les propriétés de session alors j'ai décidé de faire une sorte de chèque et de jeter la même exception que la prise de NoResultException fait dans mon code.

Je pris essentiellement le résultat de la base de données et comparé le terrain avec la chaîne I utilisé:

query.setParameter(Entry.NAME, myEntry.getName());

...

if(!StringUtils.equals(result.getName(), myEntry.getName()){
   do a cool throw just like NoResultException Catch
}

Il fallait aussi inclure la fonction Trim axtavt! Ceci est juste pour vous assurer que si la base de données a une colonne avec des espaces de fin et il correspond au paramètre donné par l'utilisateur, il sera inclus comme une réponse valable. Par exemple:

entrée de la base de données. Name = "Flavio" - Entretenu avec fonction = "Flavio"

Paramètre passé. Name = "Flavio" - Bordé par fonction automatique JPA = "Flavio"

S'il isnt coupé du tout il suffit de comparer « Flavio » avec « Flavio », retour noresult quand il était censé revenir cette entrée.

solution de contournement Nasty, mais tant qu'il n'y a pas d'autre moyen d'arrêter l'auto-nous parage devrons utiliser simplement de faire de ce genre de choses.

Merci pour toutes les autres réponses !!

Autres conseils

Je suppose que cela se produit parce que votre champ de base de données est déclarée comme CHAR(...), et donc des valeurs stockées sont complétées par des espaces blancs qui ne sont pas prises en compte par opération de =.

Alors, vous pouvez soit déclarer votre champ de base de données VARCHAR(...) ou utiliser une fonction trim intégrée:

query = "select e from Entry e where trim(trailing from e.name) =:"+ Entry.NAME
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top