我正在使用 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 进行区分大小写的字符串比较,而无需手动微调数据库?