2011-11-02 11 views
12

Escribí un proyecto para Hibernate + MySQL. Ahora lo transfiero a Derby (por varias razones).¿HQL tiene un equivalente para Restrictions.ilike (para concordancia insensible a mayúsculas y minúsculas)?

Ahora descubrí que Derby distingue entre mayúsculas y minúsculas al usar LIKE en las consultas. Esto podría resolverse usando Restrictions.ilike(...) en consultas de criterios ... pero tengo muchas complejas consultas HQL que usan eso. ¿Hay alguna manera de tener una funcionalidad similar a ilike en HQL?

+0

¿Está diciendo ** como ** no funcionará HQL en la base de datos Derby? – ManuPK

+1

como * will * work, pero distingue entre mayúsculas y minúsculas – gotch4

Respuesta

15

No hay ilike funcionalidad equivalente en HQL. Como Konstantin ya ha señalado en su suggestion, su mejor opción es tune the database connection y establecer collation en TERRITORY_BASED:SECONDARY, como se explica en esta JIRA: DERBY-1748: Global case insensitive setting.

Tenga en cuenta que todas las igualdades (=) y like s no distinguen entre mayúsculas y minúsculas. Esto podría ir demasiado lejos y no ser adecuado para su situación particular.

Otra forma de abordar esto sería crear índices basados ​​en funciones (si Derby los admite, por supuesto) y ajustar su HQL para combinar like y lower de esta manera.

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

Si Derby no soporta de (creo que no) del FBI, que también podría crear columnas de gatillo fácil, con los valores más bajos y el índice de ellos.

ACTUALIZACIÓN Parece posible definir columnas derivadas/autogeneradas, como se explica en esta otra JIRA: JIRA-481: implement SQL generated columns.

+0

pero gotch4 prefiere mantener sus consultas HQL –

+0

No tiene otra opción si no quiere cambiar la intercalación de la conexión. Y entendí que no quiere convertirlos en consultas de criterios. –

+1

Lo entiendo - podría ser una verdadera refactorización y una prueba –

Cuestiones relacionadas