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

2022-09-03 06:16:46

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

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


答案 1

HQL 中没有等效的功能。正如 Konstantin 在他的建议中已经指出的那样,您最好的选择是调整数据库连接并将排序规则设置为 ,如以下 JIRA:DERBY-1748:全局不区分大小写设置中所述。ilikeTERRITORY_BASED:SECONDARY

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

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

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

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

更新似乎可以定义派生/自动生成的列,如其他 JIRA:JIRA-481:实现 SQL 生成的列中所述


答案 2

恐怕没有办法通过HQL实现这一点,因为它只是被翻译成原生SQL。我认为这可以通过调整架构来实现:

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


推荐