2011-11-02 9 views
12

Ho scritto un progetto per Hibernate + MySQL. Ora lo sto trasferendo su Derby (per una serie di motivi).HQL ha un equivalente per Restrictions.ilike (per la corrispondenza senza distinzione tra maiuscole e minuscole)?

Ora ho scoperto che Derby è case sensitive quando si utilizza LIKE nelle query. Questo potrebbe essere risolto usando Restrictions.ilike(...) in query di criteri ... ma ho molte query HQL che lo usano. C'è un modo per avere una funzionalità simile a ilike in HQL?

+0

Stai dicendo ** come ** non funzionerà HQL nel database Derby? – ManuPK

+1

come * funzionerà *, ma distingue maiuscole e minuscole – gotch4

risposta

15

Non c'è ilike funzionalità equivalenti a HQL. Come Konstantin ha già indicato nel suo suggestion, la scelta migliore è tune the database connection e impostare collation su TERRITORY_BASED:SECONDARY, come spiegato in questa JIRA: DERBY-1748: Global case insensitive setting.

Prendere in considerazione che tutte le uguaglianze (=) e like s non fanno distinzione tra maiuscole e minuscole. Questo potrebbe andare un po 'troppo lontano e non essere adatto alla tua situazione particolare.

Un altro modo di affrontare questo sarebbe creare indici basati su funzioni (se Derby li supporta, ovviamente) e mettere a punto l'HQL per combinare like e lower in questo modo.

Query q = session.createQuery("... WHERE lower(entity.field) like ?)"); 
q.setString(0, '%' + variable.toLowerCase() + '%'); 

Se Derby non supporta di (penso che non lo fa) FBI, si potrebbe anche creare colonne di trigger-riempita con i valori più bassi e indicizzarli.

UPDATE Sembra essere possibile definire derivato/colonne generate automaticamente, come spiegato in questo altro JIRA: JIRA-481: implement SQL generated columns.

+0

ma gotch4 preferisce mantenere le sue query HQL –

+0

Non ha altra opzione se non desidera modificare le regole di connessione. E ho capito che non vuole trasformarli in richieste di criteri. –

+1

Lo capisco - potrebbe essere un incubo di refactoring e testing –

Problemi correlati