开发者

Difference between Restrictions.like and .ilike in Hibernate Criteria API

开发者 https://www.devze.com 2023-02-14 17:42 出处:网络
Hibernate\'s Criteria API has Restrictions.ilike function which has the following contract: A case-insensitive \"like\", similar to Postgres ilike operator

Hibernate's Criteria API has Restrictions.ilike function which has the following contract:

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

That's cool. But the same class also has like function, having much more vague contract:

开发者_如何学JAVA

Apply a "like" constraint to the named property

example

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


The case-sensitivity of the like operator, in MySQL, depends on the type of the columns and on their collation (see http://dev.mysql.com/doc/refman/5.5/en/case-sensitivity.html).

Hibernate is "just" a layer on top of SQL. The contract of the like operator is to issue a SQL like operator. If you want it to be the same for MySQL and PostgreSQL, then choose the right types and collations in the database schemas. But Hibernate can't magically make all the databases use the same rules.

Design your application, choose and design your database so that the behavior you observe is the behavior you expect.

PS : but I agree that the javadoc of Hibernate is... perfectible.


ilike will be doing a lower of your input value, and a lower of the column value e.g.

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


In PostgreSQL there is 'ILIKE' and 'LIKE' different operators, So case sensitivity in independent of column properties that's the reason this thing happens


Hibernate's Criteria API has Restrictions.ilike function which has the following contract:

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

That's cool. But the same class also has like function, having much more vague contract:

Apply a "like" constraint to the named property

example

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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号