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

标签 java sql hibernate hql derby

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

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

最佳答案

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

请注意所有等式 (=) 和 like 将不区分大小写。这可能有点过头,不适合您的特定情况。

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

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/

相关文章:

sql - 在 postgres 中加入动态行数

sql - 通过SUM与Group By进行SQL查询

eclipse - 使用 Maven 和 m2e 插件在 Eclipse 中添加 hibernate 依赖项

java - Hibernate 中的 session 管理(全局临时表)

java - 为什么java需要Class.forName或者动态加载?

Java Exception toString() inclusive 原因

java - 参数包含空格的运行时 exec

java - Java 应用程序退出时刷新

mysql - 过滤具有时间差的行

sql - 如何在 hibernate 中使用listagg