J'ai vu Restrictions.ilike ('propriété', '% valeur%'), mais j'aimerais générer du SQL comme: lower (propriété) = 'valeur'. Des idées?
J'ai utilisé:
Restrictions.eq("email", email).ignoreCase()
puisque Expression est obsolète. SimpleExpression appellera toLowerCase () sur la valeur, il n'est donc pas nécessaire de le faire au préalable.
Voir: source SimpleExpression
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());
...
L'expression est désormais obsolète. Utilisez plutôt des restrictions ...
crit(Restrictions.eq("firstName", firstName).ignoreCase());
Comme le suggère la réponse d'Andy, cela pour les recherches non sensibles à la casse, mais cela fonctionne également jusqu'à la version Hibernate 4.1:
crit(Restrictions.eq("firstName", firstName).ignoreCase());
Versions 4.1.1 et ultérieures d'Hibernate ne prend pas en charge la méthode ignoreCase()
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));
Par exemple, pour une entité UTILISATEUR avec les propriétés id, nom, nom, une recherche non sensible à la casse basée sur le nom sera :
Criteria crit = session.createCriteria(USER.class);
crit.add(Restrictions.ilike('name', 'Satyam', MatchMode.ANYWHERE));
Cela retournera tous les résultats, insensible à la casse.
Je ne suis pas absolument sûr, mais lorsque vous utilisez Restriction.eq, vous obtenez un objet SimpleExpression, et cet objet prend en charge une opération ignoreCase () que je n'ai jamais essayé d'utiliser, mais cela pourrait faire une différence.
Félicitations à Hibernate pour ne pas avoir documenté ce que fait réellement cette méthode.
crit(Restrictions.eq("firstName", firstName).ignoreCase());
fonctionne.
Cela retourne un SimpleExpression Object
Mais il génère une requête lower(firstname)
. Donc ça marche.