我为Hibernate + MySQL编写了一个项目。现在我将它移植到德比(出于许多原因)。HQL是否具有与Restrictions.ilike(对于不区分大小写的匹配)等效的内容?
现在我发现在查询中使用LIKE时,Derby是区分大小写的。这可以使用标准查询中的Restrictions.ilike(...)
解决......但我有很多复杂使用该查询的HQL查询。有没有办法在HQL中拥有类似ilike
的功能?
我为Hibernate + MySQL编写了一个项目。现在我将它移植到德比(出于许多原因)。HQL是否具有与Restrictions.ilike(对于不区分大小写的匹配)等效的内容?
现在我发现在查询中使用LIKE时,Derby是区分大小写的。这可以使用标准查询中的Restrictions.ilike(...)
解决......但我有很多复杂使用该查询的HQL查询。有没有办法在HQL中拥有类似ilike
的功能?
有一个在HQL没有ilike
等效的功能。正如Konstantin已经在他的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(我认为没有),您也可以使用较低的值创建触发器填充的列并对它们进行索引。
UPDATE这似乎是可能定义导出/自动生成的列,如在此其它JIRA解释:JIRA-481: implement SQL generated columns。
但gotch4更喜欢保留他的HQL查询 –
如果他不想更改连接排序规则,他没有其他选择。而且我明白他不想将它们变成标准查询。 –
我明白他 - 可能是重构和测试的地狱 –
我很害怕,没有办法通过HQL来实现这一点,因为它只是被翻译成本机SQL。我认为它可以通过调节模式可以:
http://old.nabble.com/case-insensitive-searching-td17756019.html
一个简单的解决方法是将两个词转换为大写(或小写)是这样的:从一个DomesticCat猫
其中大写(cat.name)像“FRI%”
引用:http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html
您正在告诉** like **将无法在Derby数据库中使用HQL吗? – ManuPK
like * will *可以工作,但区分大小写 – gotch4