La casse de la recherche de l'utilisation d'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-)
Vous devez vous connecter pour publier un commentaire.
Pour les cas les plus simples que vous décrivez, regarder des Restrictions.ilike(), ce qui est de la casse de la recherche.
Si vous utilisez du Printemps HibernateTemplate à interagir avec Hibernate, voici comment vous pourriez faire une recherche insensible à la casse sur une adresse email de l'utilisateur:
User u = new User(); u.setUsername(username); List<User> list = HibernateTemplate.findByExample(<u>)
pour trouver l'utilisateur de la base de données. Mais c'est en prenant le nom d'utilisateur dans le cas où je suis en donner. Mais je voulais écrire une requête qui effectuent de la recherche insensible à la casse j'ai donc utilisé le trouver, comme indiqué par SamS comme suit:List<User> list = HibernateTemplate.find("from User where upper(username)=?", u.getUsername().toUpperCase());
Vous n'avez pas à les mettre dans le '%' des caractères génériques. Vous pouvez passer MatchMode (docs pour les versions précédentes ici) à dire la recherche de la façon de se comporter.
START
,ANYWHERE
,EXACT
, etEND
correspondances sont les options.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
En veille prolongée critères de restrictions.comme(...).ignoreCase()
Je suis plus familier avec Nhibernate, donc la syntaxe peut ne pas être précis à 100%
pour certains plus d'info voir pro hibernate 3 extrait et hibernate docs 15.2. Rétrécissement de l'ensemble de résultats
La plupart des base de données par défaut les classements ne sont pas sensibles à la casse, mais dans le Serveur SQL monde, il peut être fixé à l'instance de la base de données, et au niveau de la colonne.
Vous pouviez regarder à l'aide de la Boussole un wrapper au-dessus de lucene.
http://www.compass-project.org/
En ajoutant quelques annotations à votre domaine d'objets que vous obtenez à réaliser ce genre de chose.
Boussole fournit une API simple pour travailler avec Lucene. Si vous savez comment utiliser un ORM, alors vous vous sentirez à la maison avec Boussole avec des opérations simples pour enregistrer et supprimer & query.
À partir du site lui-même.
"La construction sur le dessus de Lucene, Boussole simplifie commun des habitudes d'utilisation de Lucene tels que google recherche de style, mises à jour d'index ainsi que des concepts plus avancés tels que la mise en cache et de l'indice de fragmentation (sous-index). Boussole utilise également construit dans les optimisations concurrent s'engage et se confond."
J'ai utilisé dans le passé et je le trouve formidable.
Cela peut aussi être fait en utilisant le critère d'Exemple, dans le org.mise en veille prolongée.critère paquet.
Juste une autre façon que je trouve utile pour atteindre les objectifs susmentionnés.