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

Posted

技术标签:

【中文标题】Hibernate 函数 lower 和 upper 不适用于波兰语特殊字符【英文标题】:Hibernate functions lower and upper not working on Polish special characters 【发布时间】:2017-01-16 22:14:22 【问题描述】:

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);

这就是我得到的:

CZYSTY 班达兹 MAłY CHEMIK MAłY 机械师 SPRZęT ŚPIWóR ŚRODEK DEZYNFEKUJąCY ŚRODEK CZYSZCZąCY

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

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

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

我将非常感谢有关此事的任何提示。

编辑:我正在使用带有 SQLite 数据库和驱动程序 Xerial 3.8.11.2 的 Hibernate 5.2.2 Final。

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

【问题讨论】:

你用的是哪个版本? @khalilM 我正在​​使用带有 SQLite 数据库的 Hibernate 5.2.2 Final 和 Xerial 3.8.11.2 :) 但是“ł”可以正常工作吗? @khaliM 对不起,我忘了包括那个,“ł”也应该改为“Ł” 只需检查您的数据库/休眠或 Jsp UTF-8 编码 【参考方案1】:

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

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

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

【讨论】:

以上是关于Hibernate 函数 lower 和 upper 不适用于波兰语特殊字符的主要内容,如果未能解决你的问题,请参考以下文章

SQL sever 部分常量函数及系统函数使用

IN 表达式中的 JPQL LOWER 函数

算法训练 大小写判断

hibernate hql语句怎么在查询时区分大小写?

二分检索函数lower_bound()和upper_bound()

c++stl之lower_bound,upper_bound和equal_range函数的详细介绍!!!