Hibernate函数的低级和高级函数不适用于波兰语特殊字符

时间:2016-09-08 20:57:48

标签: java hibernate jpa persistence jpql

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

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

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

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

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

这就是我得到的:

  • CZYSTYBANDAż
  • MAłYCHEMIK
  • MAłYMECHANIK
  • SPRZęT
  • ŚPIWóR
  • ŚRODEKDEZYNFEKUJąCY
  • ŚRODEKCZYSZCZąCY

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

当我使用较低的功能时会发生同样的事情。波兰字符完全不受影响并保持不变。

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

我会非常感谢这件事的暗示。

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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