Hibernate 函数 lower 和 upper 不适用于波兰语特殊字符

Hibernate functions lower and upper not working on Polish special characters

我对 JPA (Hibernate) 中的 lower 和 upper 函数有疑问。在我的应用程序中,用户应该向数据库添加一个新项目,但名称应该是唯一的。为了实现这一点,我需要将用户输入的字符串与数据库中的字符串进行比较,并在检查时忽略大小写。

不幸的是,当我使用 Hibernate 函数将所有数据设为大写(以便比较)时,除了波兰语特殊字符保持不变外,一切正常。

这是我用于测试目的的代码,以检查它是否有效:

TypedQuery<String> query = em.createQuery("SELECT upper(i.name) FROM Item i", String.class);

for (String name: query.getResultList())
    System.out.println(name);

这就是我得到的:

所有字母都应大写。在数据库中,第一个单词的每个首字母始终大写。问题涉及这样的字符:ą, ę, ż, ź, ó, ł - 它们应该看起来像 Ą, Ę, Ż, Ź, Ó, Ł,但 Hibernate 似乎无法将它们识别为仅大小写不同的单个字符。

当我使用较低的函数时,同样的事情发生了。波兰语字符完全不受影响,保持不变。

我不知道它是只涉及波兰语字符还是也涉及任何其他语言。

如有任何提示,我将不胜感激。

编辑:我将 Hibernate 5.2.2 Final 与 SQLite 数据库和驱动程序 Xerial 3.8.11.2 一起使用。

EDIT2:如果我尝试使用带有 Hibernate 的本机 SQL 查询来实现这一点,也会发生同样的情况。

我已经找到解决办法了。事实证明,SQLite 不支持 Unicode 排序规则。使用lower、upper函数或排序时,只能支持ASCII拉丁字符。

有一个扩展(SQLite ICU 扩展),必须编译 SQLite 才能使用 Unicode 排序规则(或其他排序规则),但就我而言,它并不像我想的那么简单喜欢它。我决定将数据库提供程序更改为 H2,它默认支持 Unicode 排序规则,无需执行任何修改,现在它就像一个魅力:)

所以这不是 Hibernate 的错,而是 SQLite 的错。非常感谢您的帮助:)