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

Hibernate: Case insensitive search does not work for special characters

我有一个搜索 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)) + "%");

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

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

您可以尝试使用 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 中转换大小写 - 这将导致难以调查错误...