我有一个搜索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(αβγδ
)的小字母,并找到结果。也许这是降低值的常用方法,因为数据库正确地降低了值。我只是想知道这是否适用于任何语言。
答案 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改造案例 - 这会导致调查错误......