2011-11-02 49 views
12

我为Hibernate + MySQL编写了一个项目。现在我将它移植到德比(出于许多原因)。HQL是否具有与Restrictions.ilike(对于不区分大小写的匹配)等效的内容?

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

+0

您正在告诉** like **将无法在Derby数据库中使用HQL吗? – ManuPK

+1

like * will *可以工作,但区分大小写 – gotch4

回答

15

有一个在HQL没有ilike等效的功能。正如Konstantin已经在他的suggestion中指出的那样,您的最佳选择是tune the database connection并将collation设置为TERRITORY_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(我认为没有),您也可以使用较低的值创建触发器填充的列并对它们进行索引。

UPDATE这似乎是可能定义导出/自动生成的列,如在此其它JIRA解释:JIRA-481: implement SQL generated columns

+0

但gotch4更喜欢保留他的HQL查询 –

+0

如果他不想更改连接排序规则,他没有其他选择。而且我明白他不想将它们变成标准查询。 –

+1

我明白他 - 可能是重构和测试的地狱 –

相关问题