JPA comparaison de chaînes de caractères
J'ai écrit un simple système de connexion à l'aide d'une requête JPQL, qui revient toujours pas de résultat:
public boolean check(String name, String password) {
final String qstring="SELECT e FROM Muser e WHERE e.name = '"+name+"'";
Muser user;
try{
user = em.createQuery(qstring, Muser.class).getSingleResult();
}
catch(NoResultException e){
return false;
}
return password.equals(user.getPassword());
}
Quand je l'ai changé pour une requête native:
user = (Muser) em.createNativeQuery(qstring, Muser.class).getSingleResult();
ou un int expression:
final String qstring="SELECT e FROM Muser e WHERE e.id = "+id;
Il va tout droit. Quel est le problème? Un million de mercis!
- Ne pas stocker les mots de passe en texte clair: hash eux. Créez la requête des arguments: les paramètres d'utilisation (pour éviter l'injection de code).
Vous devez vous connecter pour publier un commentaire.
Il pourrait être un problème avec comparaison de chaînes de caractères dans votre fournisseur JPA. Avez-vous tester sur le cas de données sensibles?
Vous pouvez également essayer (et c'est le moyen préféré) à l'aide de paramètres au lieu de l'élaboration de votre déclaration à la main. Ce n'est pas seulement plus sûr (empêche l'injection SQL), mais aussi plus rapide: pas seulement pour Java (vous n'avez pas concaténer des Chaînes de caractères), mais aussi pour la bd (la requête peut être établi une fois pour toutes les exécutions). Il pourrait être quelque chose comme ceci:
<>
?Je pense que le problème est à cause de comparaison de chaînes de caractères.Ma solution à ce problème est le suivant:
à l'aide de minuscules à des fins de comparaison.