2009-03-09 5 views

Répondre

65

Faites attention à utiliser ilike car cela permettrait à quelqu'un d'entrer des choses comme "test%" et de faire correspondre. J'utilise ce qui suit pour faire un égal insensible à la casse dans une application:

... 
Criteria crit=session.createCriteria(Event.class); 
crit.add(Expression.eq("rsvpCode","test1").ignoreCase()); 
... 
+9

c'est maintenant déprécié, des mises à jour pour la version 4? – NimChimpsky

+7

Utilisez à la place Restrictions (voir ma réponse ci-dessous) –

7

Je ne suis pas absolument sûr, mais lorsque vous utilisez Restriction.eq vous obtenez un objet SimpleExpression, et cet objet suppports une opération ignoreCase() que je ne l'ai jamais essayé d'utiliser, mais sonne comme ça pourrait faire la différence.

Kudos à Hibernate pour ne pas documenter ce que cette méthode fait réellement.

+0

Attention, Uri, Gavin King ou Christian Baer pourraient être en train de regarder ... 8) Ils ont tendance à être un peu défensifs sur les critiques sur les forums Hibernate. – duffymo

+0

J'ai fait mon doctorat recherche sur la convivialité et l'exactitude de JavaDocs ... Donc, en omettant complètement les JavaDocs sur ces méthodes enlève de mon travail;) – Uri

67

L'expression est maintenant obsolète. Utilisez Restrictions à la place ...

crit(Restrictions.eq("firstName", firstName).ignoreCase()); 
+0

Cela ne fonctionne pas si la propriété est de type enum. En interne, hibernate applique lower() aux colonnes qui échouent réellement pour les types enum. Connaissez-vous la solution pour cela? – akhi

+0

Si vous utilisez une base de données mysql, l'ignorecase utilise plus bas dans la course sql réelle contre la base de données. Comme vous ne pouvez pas créer des index "inférieurs" dans mysql (bien que vous puissiez dans d'autres bases de données je crois).Cela signifie qu'il ne tire profit d'aucun index que vous avez sur la colonne (dans ce cas "firstName") –

+0

Il y a aussi un problème de comparaison de caractères car ils ne sont pas des chaînes mais vous vous attendez à ce que ignoreCase fonctionne avec cela. – borjab

0

crit(Restrictions.eq("firstName", firstName).ignoreCase()); fonctionne.

Cela a renvoyé un SimpleExpression Object mais génère une requête lower(firstname). Donc ça fonctionne.

+0

S'il vous plaît, essayez de lire ce http://stackoverflow.com/about, pour obtenir plus de compréhension sur les questions/réponses ici sur SO. Votre contribution ne répond pas à la question. C'est plus un commentaire, que vous pouvez ajouter une fois que vous augmenterez votre réputation: http://stackoverflow.com/faq#reputation –

10

Comme la réponse de Andy suggère, pour leurs recherches insensibles à la casse, mais il est fonctionne aussi par la mise en veille prolongée Version 4.1:

crit(Restrictions.eq("firstName", firstName).ignoreCase()); 

versions 4.1.1 et plus tard d'Hibernate ne supportent pas la ignoreCase() méthode sur Restriction.eq(). Pour cela, nous devons utiliser ilike avec MatchMode.

Criteria crit = session.createCriteria(ENTITY.class); 
crit.add(Restrictions.ilike('PROPERTY NAME', 'VALUE', MatchMode.ANYWHERE)); 

À titre d'exemple, pour une entité utilisateur avec id , nom, prénom propriétés, une recherche insensible à la casse en fonction du nom sera:

Criteria crit = session.createCriteria(USER.class); 
crit.add(Restrictions.ilike('name', 'Satyam', MatchMode.ANYWHERE)); 

Ceci renverra tous les résultats , insensible à la casse.

+2

une raison pour laquelle ils ne le supportent plus? –

Questions connexes