hibernate HQL是否有Restrictions.ilike的等价物(用于不区分大小写的匹配)?

3vpjnl9f  于 2023-04-06  发布在  其他
关注(0)|答案(3)|浏览(170)

我为Hibernate+MySQL写了一个项目,现在我正在将它移植到Derby(有很多原因)。
现在我发现Derby在查询中使用LIKE时是大小写敏感的。这可以在Criteria查询中使用Restrictions.ilike(...)来解决......但是我有很多 * 复杂 * 的HQL查询都使用它。有没有一种方法可以在HQL中拥有类似于ilike的功能?

zzzyeukh

zzzyeukh1#

在HQL中没有ilike等效的功能。正如Konstantin在他的建议中已经指出的那样,您的最佳选择是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 lower(?)");
q.setString(0, '%' + variable + '%');

如果Derby不支持FBI(我认为它不支持),您也可以用较低的值创建触发器填充的列,并对它们进行索引。

UPDATE似乎可以定义派生/自动生成的列,如在另一个JIRA中所解释的:JIRA-481: implement SQL generated columns

laawzig2

laawzig22#

我很担心,没有办法通过HQL实现这一点,因为它只是被翻译成原生SQL。我认为可以通过调优模式来实现:
http://old.nabble.com/case-insensitive-searching-td17756019.html

r3i60tvu

r3i60tvu3#

一个简单的解决方法是将两个单词都转换为大写(或小写),如下所示:
from DomesticCat cat where upper(cat.name)like 'FRI%'
引用:http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html

相关问题