Hibernate:不区分大小写的搜索不适用于特殊字符

时间:2016-06-11 20:36:27

标签: java hibernate postgresql hql case-insensitive

我有一个搜索HQL查询:

@NamedQuery(name = "Recipe.findByTitle", query = "SELECT r.title FROM Recipe r WHERE UPPER(r.title) LIKE :titlePart")

在数据库中,我有以下价值:Heiße Suppe 由于不区分大小写的搜索,我需要在Java中将输入字符串设置为大写。我尝试通过传递字符eiße

来搜索此条目
language = "de";
characters = "eiße";
queryTitle.setParameter("titlePart", "%" + characters.toUpperCase(new Locale(language)) + "%");

由于德语区域设置,预计尖锐的s('ß')将被Java转换为SS。这有效(虽然它甚至适用于Locale.ENGLISH,但这是另一个问题)..然而,问题是HQL的UPPER没有将尖锐的''''转换为SS,这就是为什么它不会返回任何结果。我不确定hibernate在UPPER中使用特殊字符做了什么,但它与Java不同。 (仅适用于非特殊字符) 对于这种情况,解决方案是将两者都设置为小写,但我怀疑这适用于世界上所有具有特殊字符的语言,还是总是使用toLowerCase的解决方案,对于任何语言?

[UPDATE]
我仍然不确定这是否适用于所有语言,但我使用希腊语值进行了一些测试。我将希腊大写字母alpha插入到gamma(ΑΒΓΔ)到数据库中,然后我搜索alpha到gamma(αβγδ)的小字母,并找到结果。也许这是降低值的常用方法,因为数据库正确地降低了值。我只是想知道这是否适用于任何语言。

1 个答案:

答案 0 :(得分:1)

您可以尝试使用ILIKE:

query = "SELECT r.title FROM Recipe r WHERE r.title ILIKE ('%' || :titlePart || '%')"

或Hibernate中两个部分的大小写转换:

query = "SELECT r.title FROM Recipe r WHERE UPPER(r.title) LIKE ('%' || UPPER(:titlePart) || '%')"

其中

queryTitle.setParameter("titlePart", characters);

我不建议用Java改造案例 - 这会导致调查错误......