我为Hibernate + MySQL编写了一个项目。现在我将它移植到德比(出于多种原因)。
现在我发现在查询中使用LIKE时,Derby区分大小写。这可以使用Criteria查询中的Restrictions.ilike(...)
来解决...但是我有很多使用它的复杂 HQL查询。有没有办法在HQL中使用类似于ilike
的功能?
答案 0 :(得分:18)
HQL中没有ilike
等效功能。正如康斯坦丁已经在他的suggestion中指出的那样,你最好选择tune the database connection并将collation设置为TERRITORY_BASED:SECONDARY
,如本JIRA中所述:DERBY-1748: Global case insensitive setting。
考虑到所有等式(=
)和like
s都不区分大小写。这可能有点太过分了,并不适合您的特定情况。
解决这个问题的另一种方法是创建基于函数的索引(当然,如果Derby支持它们),并调整你的HQL,将like
和lower
组合在一起。
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的,其中upper(cat.name)喜欢'FRI%'
参考:http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html