【发布时间】:2011-11-28 08:59:12
【问题描述】:
我正在使用 JPA(Hibernate 作为提供者)和底层 MySQL 数据库。
我有一张包含德国所有街道名称的表格。每个街道名称都有一个唯一的编号。对于一项任务,我必须找出名称的编号。为此,我编写了一个 JPQL 查询,如下所示
"SELECT s FROM Strassencode s WHERE s.name = :name"
不幸的是,德国的街道名称只有大小写字母不同,例如“Am kleinen Feld”和“Am Kleinen Feld”。显然其中一个是语法错误的,但作为街道名称,两种拼写都是允许的,并且它们都有不同的数字。
当我将 JPQL 查询发送到数据库时,我正在使用
query.getSingleResult();
因为事实上,表中的每个街道名称都是唯一的。但是对于底层的 MySQL 数据库,我会得到一个NonUniqueResultException,因为默认情况下,mySQL 数据库会进行不区分大小写的比较。强制使用 mySQL 的常用方法是编写类似
SELECT 'abc' LIKE BINARY 'ABC';
如mySQL参考手册11.5.1章节所述,但JPQL中没有对应的关键字。
我的第一次尝试是在课堂上注释字段name
@Column(nullable = false, columnDefinition = "varbinary(128)")
这样注释,数据库会自动进行区分大小写的比较,因为其中一个字符串是二进制的。但是当我使用这个解决方案时,当我从数据库中读取名称并将它们写入文件时遇到了麻烦,因为像 ä、ö、ü 这样的字母会被错误地解释。
我知道,name 字段应该获得一个 uniqueConstraint,这是我的目标之一,但这只有在数据库将进行区分大小写的字符串比较时才有可能。
有没有解决方案,我可以配置 JPA 进行区分大小写的字符串比较,而无需手动微调数据库?
【问题讨论】: