L'API Criteria
d'Hibernate a Restrictions.ilike
fonction qui a le contrat suivant:
Un "like" insensible à la casse, semblable à l'opérateur semblable à Postgres
C'est super. Mais la même classe a également la fonction like
, ayant un contrat beaucoup plus vague:
Appliquer une contrainte "similaire" à la propriété nommée
exemple
Criteria cr = session.createCriteria(Employee.class);
// To get records having fistName starting with zara
cr.add(Restrictions.like("firstName", "zara%"));
// Case sensitive form of the above restriction.
cr.add(Restrictions.ilike("firstName", "zara%"));
La casse de l'opérateur similaire dans MySQL dépend du type des colonnes et de leur classement (voir http://dev.mysql.com/doc/refman/5.5/en/case-sensitivity .html ).
Hibernate est "juste" une couche au-dessus de SQL. Le contrat de l'opérateur similaire consiste à émettre un opérateur de type SQL. Si vous souhaitez qu'il en soit de même pour MySQL et PostgreSQL, choisissez les bons types et classements dans les schémas de base de données. Mais Hibernate ne peut pas faire comme par magie toutes les bases de données utilisent les mêmes règles.
Concevez votre application, choisissez et concevez votre base de données afin que le comportement que vous observez soit celui que vous attendez.
PS: mais je suis d'accord que le javadoc d'Hibernate est ... perfectible.
ilike
fera une valeur inférieure à votre valeur d'entrée et une valeur inférieure à la colonne, par exemple.
select * from table where lower(column) like lower(?)