L'utilisation d'hibernate critères, il est un moyen d'échapper les caractères spéciaux?
Pour cette question, nous voulons éviter d'avoir à écrire une requête spéciale depuis la requête devrait être différente sur plusieurs bases de données. En utilisant seulement hibernate critères, nous voulons être en mesure d'échapper les caractères spéciaux.
Cette situation est la raison pour avoir besoin de la capacité à échapper les caractères spéciaux:
Supposons que nous avons le tableau " foo " dans la base de données. La Table 'foo' ne contient que des 1, appelé "nom". Le nom de domaine peut contenir des caractères qui peuvent être considérés comme spéciaux dans une base de données. Deux exemples de ce nom sont "name_1' et 'nom%1'. À la fois le '_' et '%' sont des caractères spéciaux, au moins dans Oracle. Si un utilisateur souhaite effectuer une recherche pour l'un de ces exemples une fois qu'ils sont entrés dans la base de données, des problèmes peuvent se produire.
criterion = Restrictions.ilike("name", searchValue, MatchMode.ANYWHERE);
return findByCriteria(null, criterion);
Dans ce code, 'searchValue' est la valeur que l'utilisateur a donné l'application à utiliser pour la recherche. Si l'utilisateur souhaite effectuer une recherche pour '%', l'utilisateur va être retourné avec tous les 'foo' entrée dans la base de données. C'est parce que le caractère '%' représente le "nombre de caractères" joker pour la correspondance de chaîne et le code SQL qui hibernate produit ressemblera:
select * from foo where name like '%'
Est-il un moyen de dire à hibernate pour échapper certains caractères, ou à créer une solution de contournement qui n'est pas le type de base de données spécifique?
OriginalL'auteur Kevin Crowell | 2009-03-23
Vous devez vous connecter pour publier un commentaire.
LikeExpression de constructeurs sont tous protégés, il n'est donc pas une option viable. Aussi, il a les problèmes de son propre.
Un collègue et j'ai créé un patch qui fonctionne plutôt bien. L'essentiel de la pièce est que pour la LikeExpression constructeur qui consomme une MatchMode, nous échapper les caractères spéciaux. Pour le constructeur qui consomme un Caractère (le caractère d'échappement), nous supposons que l'utilisateur s'échappe les caractères spéciaux sur leur propre.
Nous avons également paramétré le caractère d'échappement pour s'assurer qu'il ne peut pas corrompre la requête SQL s'ils utilisent quelque chose comme \ ou un devis de caractère.
Si vous vous demandez quelle est la lhs et typedValue méthodes sont pour la, le nouveau IlikeExpression devrait répondre à ces questions.
Après cela, la seule chose qui reste est de faire des Restrictions de l'usage de ces nouvelles classes:
Edit: Ah oui. Cela fonctionne pour Oracle. Nous ne sommes pas sûr d'autres bases de données.
OriginalL'auteur Daniel Reeves
Ce n'est pas très propre façon de faire, mais un sqlRestrinction devrait être plus facile:
Vous pouvez même faire un début avec une recherche en utilisant le même principe:
{alias}
espace réservé danscolumnName
, cet espace se réfère toujours à la table de l'entité de la racine est mappé. Si vous utilisez toutes les jointures dans votre requête, Hibernate ne peut pas insérer les noms d'alias pour les tables de jointure. Dans ce cas, j'ai dû recourir à la sous-classementLikeExpression
.Cela aide: j'ai essayé de critères.ajouter(Restrictions.sqlRestriction(columnName+ " (comme '!%' escape '!'")); ilike ne fonctionne pas pour moi
OriginalL'auteur Kalem
si vous utilisez LikeExpression directement, il vous permet de spécifier le caractère d'échappement. je suppose que cela devrait être tout ce dont vous avez besoin.
IlikeExpression ne l'ont pas bien.
Tous LikeExpression de constructeurs sont protégés, vous auriez besoin de sous-classe et de faire un constructeur public.
OriginalL'auteur james
Si vous utiliser Hibernate 3.2+, vous pouvez sous-classe
LikeExpression
, puis créer usinelike
/ilike
méthodes:OriginalL'auteur Yahor