Hibernate Criteria API中Restrictions.like和.ilike之间的区别

时间:2011-03-01 20:56:41

标签: java sql hibernate database-agnostic

Hibernate的Criteria API具有Restrictions.ilike功能,该功能具有以下合同:

  

不区分大小写的“喜欢”,类似于Postgres ilike运算符

那很酷。但同一个班级也有like功能,合同含义要多得多:

  

对命名属性

应用“like”约束

例如

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

4 个答案:

答案 0 :(得分:12)

MySQL中类似运算符的区分大小写取决于列的类型和排序规则(请参阅http://dev.mysql.com/doc/refman/5.5/en/case-sensitivity.html)。

Hibernate“只是”SQL之上的一层。 like运算符的契约是发出类似SQL的运算符。如果您希望它与MySQL和PostgreSQL相同,那么请在数据库模式中选择正确的类型和排序规则。但是Hibernate不能神奇地让所有数据库使用相同的规则。

设计应用程序,选择和设计数据库,以便您观察到的行为是您期望的行为。

PS:但我同意Hibernate的javadoc是......可以完善的。

答案 1 :(得分:1)

ilike将使用较低的输入值,以及较低的列值,例如

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

答案 2 :(得分:-1)

Hibernate的Criteria API具有Restrictions.ilike功能,具有以下合同:

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

很酷。但是同一个班级也有类似功能,合同含义要多得多:

Apply a "like" constraint to the named property

例如

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

答案 3 :(得分:-2)

在PostgreSQL中有'ILIKE'和'LIKE'不同的运算符, 因此,独立于列属性的区分大小写就是这个事情发生的原因