java sql hibernate database-agnostic

java - Diferencia entre Restrictions.like y.ilike en la API de criterios de hibernación



sql hibernate (4)

En PostgreSQL hay diferentes operadores ''ILIKE'' y ''LIKE'', así que la sensibilidad a mayúsculas y minúsculas es independiente de las propiedades de la columna, por eso sucede esto

La API de Criteria de Hibernate tiene la función Restrictions.ilike que tiene el siguiente contrato:

Un "me gusta" que no distingue entre mayúsculas y minúsculas, similar al operador de Postgres ilike

Eso es genial. Pero la misma clase también tiene una función, teniendo un contrato mucho más vago:

Aplicar una restricción "similar" a la propiedad nombrada

ejemplo

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 API de criterios de Hibernate tiene la función Restrictions.ilike que tiene el siguiente contrato:

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

Eso es genial. Pero la misma clase también tiene una función, teniendo un contrato mucho más vago:

Apply a "like" constraint to the named property

ejemplo

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 sensibilidad a mayúsculas y minúsculas del operador similar, en MySQL, depende del tipo de columnas y de su intercalación (consulte http://dev.mysql.com/doc/refman/5.5/en/case-sensitivity.html ).

Hibernate es "solo" una capa encima de SQL. El contrato del operador similar es emitir un operador similar a SQL. Si desea que sea igual para MySQL y PostgreSQL, elija los tipos y las intercalaciones correctos en los esquemas de la base de datos. Pero Hibernate no puede hacer mágicamente que todas las bases de datos usen las mismas reglas.

Diseñe su aplicación, elija y diseñe su base de datos para que el comportamiento que observe sea el que espera.

PD: pero estoy de acuerdo en que el javadoc de Hibernate es ... perfecto.


ilike hará una menor parte de su valor de entrada y una menor del valor de la columna, por ejemplo,

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