web-dev-qa-db-fra.com

Différence entre Restrictions.like et .ilike dans l'API Hibernate Criteria

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%"));
22
mindas

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.

12
JB Nizet

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(?)

1
Tom Chamberlain