我在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);
这就是我得到的:
所有字母都应该是大写字母。在数据库中,第一个单词的每个首字母总是大写。问题涉及如下字符:±,ę,ż,ź,ó,ł - 它们应该看起来像Ą,Ę,Ż,Ź,Ó,Ł,但是Hibernate似乎不会将它们视为单个字符,仅在案例方面有所不同。
当我使用较低的功能时会发生同样的事情。波兰字符完全不受影响并保持不变。
我不知道它是否只涉及波兰人或任何其他语言。
我会非常感谢这件事的暗示。
编辑:我正在使用Hibernate 5.2.2 Final和SQLite数据库以及驱动程序Xerial 3.8.11.2。
EDIT2:如果我尝试使用Hibernate的本机SQL查询来实现这一点,也会发生同样的情况。
答案 0 :(得分:0)
我已经找到了解决方案。事实证明,SQLite并不支持Unicode排序规则。它只能在使用低位,高位函数或排序时支持ASCII拉丁字符。
有一个扩展(SQLite ICU扩展),必须编译SQLite才能使用Unicode排序规则(或其他排序规则),但就我而言,它并不像我想的那样简单。喜欢它。我决定将数据库提供程序更改为H2,默认情况下支持Unicode排序规则而不执行任何修改,它现在就像魅力一样:)
所以它不是Hibernate的错,而是SQLite的错。非常感谢你的帮助:))