我为Hibernate+MySQL写了一个项目,现在我正在将它移植到Derby(有很多原因)。现在我发现Derby在查询中使用LIKE时是大小写敏感的。这可以在Criteria查询中使用Restrictions.ilike(...)来解决......但是我有很多 * 复杂 * 的HQL查询都使用它。有没有一种方法可以在HQL中拥有类似于ilike的功能?
Restrictions.ilike(...)
ilike
zzzyeukh1#
在HQL中没有ilike等效的功能。正如Konstantin在他的建议中已经指出的那样,您的最佳选择是tune the database connection并将collation设置为TERRITORY_BASED:SECONDARY,如本JIRA中所解释的:DERBY-1748: Global case insensitive setting。考虑到所有等式(=)和like s都不区分大小写。这可能有点过分,并且不适合您的特定情况。解决这个问题的另一种方法是创建基于函数的索引(当然,如果Derby支持它们的话),并调整HQL以像这样合并like和lower。
TERRITORY_BASED:SECONDARY
=
like
lower
Query q = session.createQuery("... WHERE lower(entity.field) like lower(?)"); q.setString(0, '%' + variable + '%');
如果Derby不支持FBI(我认为它不支持),您也可以用较低的值创建触发器填充的列,并对它们进行索引。
UPDATE似乎可以定义派生/自动生成的列,如在另一个JIRA中所解释的:JIRA-481: implement SQL generated columns。
laawzig22#
我很担心,没有办法通过HQL实现这一点,因为它只是被翻译成原生SQL。我认为可以通过调优模式来实现:http://old.nabble.com/case-insensitive-searching-td17756019.html
r3i60tvu3#
一个简单的解决方法是将两个单词都转换为大写(或小写),如下所示:from DomesticCat cat where upper(cat.name)like 'FRI%'引用:http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html
3条答案
按热度按时间zzzyeukh1#
在HQL中没有
ilike
等效的功能。正如Konstantin在他的建议中已经指出的那样,您的最佳选择是tune the database connection并将collation设置为TERRITORY_BASED:SECONDARY
,如本JIRA中所解释的:DERBY-1748: Global case insensitive setting。考虑到所有等式(
=
)和like
s都不区分大小写。这可能有点过分,并且不适合您的特定情况。解决这个问题的另一种方法是创建基于函数的索引(当然,如果Derby支持它们的话),并调整HQL以像这样合并
like
和lower
。如果Derby不支持FBI(我认为它不支持),您也可以用较低的值创建触发器填充的列,并对它们进行索引。
UPDATE似乎可以定义派生/自动生成的列,如在另一个JIRA中所解释的:JIRA-481: implement SQL generated columns。
laawzig22#
我很担心,没有办法通过HQL实现这一点,因为它只是被翻译成原生SQL。我认为可以通过调优模式来实现:
http://old.nabble.com/case-insensitive-searching-td17756019.html
r3i60tvu3#
一个简单的解决方法是将两个单词都转换为大写(或小写),如下所示:
from DomesticCat cat where upper(cat.name)like 'FRI%'
引用:http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html