我写了一个Hibernate+MySQL的项目。现在我将它移植到 Derby(出于多种原因)。
现在我发现 Derby 在查询中使用 LIKE 时区分大小写。这可以使用 Restrictions.ilike(...)
解决在 Criteria 查询中...但我有许多使用它的复杂 HQL 查询。有没有办法在 HQL 中实现类似于 ilike
的功能?
最佳答案
HQL 中没有ilike
等效功能。正如康斯坦丁已经在他的 suggestion 中指出的那样,你最好的选择是tune the database connection并设置 collation到 TERRITORY_BASED:SECONDARY
,如本 JIRA 中所述:DERBY-1748: Global case insensitive setting .
请注意所有等式 (=
) 和 like
将不区分大小写。这可能有点过头,不适合您的特定情况。
解决此问题的另一种方法是创建基于函数的索引(当然,如果 Derby 支持它们)并调整您的 HQL 以像这样组合 like
和 lower
。
Query q = session.createQuery("... WHERE lower(entity.field) like ?)");
q.setString(0, '%' + variable.toLowerCase() + '%');
如果 Derby 不支持 FBI(我认为它不支持),您还可以创建具有较低值的触发器填充列并为它们建立索引。
更新 似乎可以定义派生/自动生成的列,如其他 JIRA 中所述:JIRA-481: implement SQL generated columns .
关于java - HQL 是否有 Restrictions.ilike 的等效项(用于不区分大小写的匹配)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7977765/