HQL是否具有Restrictions.ilike的等效项(用于不区分大小写的匹配)?

时间:2011-11-02 08:59:37

标签: java sql hibernate hql derby

我为Hibernate + MySQL编写了一个项目。现在我将它移植到德比(出于多种原因)。

现在我发现在查询中使用LIKE时,Derby区分大小写。这可以使用Criteria查询中的Restrictions.ilike(...)来解决...但是我有很多使用它的复杂 HQL查询。有没有办法在HQL中使用类似于ilike的功能?

3 个答案:

答案 0 :(得分:18)

HQL中没有ilike等效功能。正如康斯坦丁已经在他的suggestion中指出的那样,你最好选择tune the database connection并将collation设置为TERRITORY_BASED:SECONDARY,如本JIRA中所述:DERBY-1748: Global case insensitive setting

考虑到所有等式(=)和like s都不区分大小写。这可能有点太过分了,并不适合您的特定情况。

解决这个问题的另一种方法是创建基于函数的索引(当然,如果Derby支持它们),并调整你的HQL,将likelower组合在一起。

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

如果Derby不支持FBI(我认为它不支持),您还可以创建具有较低值的触发器填充列并将其编入索引。

UPDATE 似乎可以定义派生/自动生成的列,如本其他JIRA中所述:JIRA-481: implement SQL generated columns

答案 1 :(得分:2)

我担心,没有办法通过HQL实现这一点,因为它只是转换为本机SQL。我认为可以通过调整架构来实现:

http://old.nabble.com/case-insensitive-searching-td17756019.html

答案 2 :(得分:0)

一个简单的解决方法是将两个单词转换为大写(或小写),如下所示:

来自DomesticCat cat的

,其中up​​per(cat.name)喜欢'FRI%'

参考:http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html