49 votes

Recherche insensible à la casse avec Hibernate

Je suis de l'utilisation d'Hibernate pour l'ORM de mon application Java à une base de données Oracle (pas que le fournisseur de base de données de questions, nous pouvons passer à une autre base de données, un jour), et je veux récupérer les objets de la base de données en fonction de l'utilisateur fourni par les chaînes. Par exemple, lors de la recherche de personnes, si l'utilisateur est à la recherche pour les personnes qui vivent dans 'fran', je veux être en mesure de donner à son peuple à San Francisco.

SQL n'est pas mon point fort, et je préfère de Hibernate Criteria code de la construction des chaînes codées en dur tel qu'il est. Quelqu'un peut me pointer dans la bonne direction sur la façon de le faire dans le code, et si cela est impossible, comment codées en dur SQL devrait ressembler?

Merci,

Yuval =8-)

72voto

Cowan Points 17235

Pour le cas simple que vous décrivez, regardez Restrictions.ilike (), qui effectue une recherche insensible à la casse.

 Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.ilike('town', '%fran%');
List results = crit.list();
 

9voto

SamS Points 827

Si vous utilisez HibernateTemplate de Spring pour interagir avec Hibernate, voici comment procéder pour effectuer une recherche sans distinction de casse sur l'adresse de messagerie d'un utilisateur:

 getHibernateTemplate().find("from User where upper(email)=?", emailAddr.toUpperCase());
 

4voto

Richard Points 1468

L'approche habituelle de ignorant la casse est de convertir les valeurs de base de données et la valeur d'entrée en majuscules ou en minuscules - la résultante de sql serait quelque chose comme

sélectionnez f.nom de f où TO_UPPER(f.nom) like '%FRAN%'

Dans hibernate critères de restrictions.comme(...).ignoreCase()

Je suis plus familier avec Nhibernate, donc la syntaxe peut ne pas être précis à 100%

pour plus d'info voir les pro hibernate 3 extrait et hibernate docs 15.2. Rétrécissement de l'ensemble de résultats

4voto

Arthur Thomas Points 3399

Vous n'avez pas non plus besoin de mettre les caractères génériques '%'. Vous pouvez passer MatchMode (la documentation des versions précédentes ici ) pour indiquer à la recherche comment se comporter. START , ANYWHERE , EXACT , et END correspond aux options.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X