2011-03-01 6 views
21

Criteria API di Hibernate ha Restrictions.ilike funzione che ha il seguente contratto:Differenza tra Restrictions.like e .ilike in Hibernate Criteria API

Un caso-insensitive "simile", simile a Postgres operatore ilike

È bello. Ma la stessa classe ha anche like funzione, avendo molto più vago contratto:

Applicare un "come" vincolo per la proprietà denominata

esempio

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

risposta

11

Il caso-sensibilità l'operatore like, in MySQL, dipende dal tipo di colonne e dalle loro regole di confronto (vedere http://dev.mysql.com/doc/refman/5.5/en/case-sensitivity.html).

Hibernate è "solo" un livello sopra SQL. Il contratto dell'operatore simile è quello di emettere un operatore simile a SQL. Se vuoi che sia lo stesso per MySQL e PostgreSQL, quindi scegli i giusti tipi e le regole di confronto negli schemi del database. Ma Hibernate non può magicamente fare in modo che tutti i database usino le stesse regole.

Progetta la tua applicazione, scegli e progetta il tuo database in modo che il comportamento che osservi sia il comportamento che ti aspetti.

PS: ma sono d'accordo che il javadoc di Hibernate è ... perfettibile.

+0

fa 'lavoro ilike' per MySQL? – mmcrae

+0

@mmcrae sì, dovrebbe funzionare. Cosa succede quando provi ad usarlo? –

0

In PostgreSQL c'e 'ILIKE' e diversi operatori 'come', Quindi, la sensibilità caso in indipendente dalle proprietà delle colonne Questa è la ragione per cui questo accade

-1

di Hibernate Criteria API ha funzione Restrictions.ilike che ha il seguente contratto :

A case-insensitive "like", similar to Postgres ilike operator 

Questo è bello. Ma la stessa classe ha anche come la funzione, avendo molto più vago contratto:

Apply a "like" constraint to the named property 

esempio

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%")); 
+0

La seconda riga di commento in questo esempio contraddice la prima riga in questa risposta! –

0

ilike farà un più basso del valore di input, e un più basso del valore della colonna per esempio

select * from table where lower(column) like lower(?)