Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 与JPA无关的数据库字符串比较_Java_Mysql_Jpa_Jpql - Fatal编程技术网

Java 与JPA无关的数据库字符串比较

Java 与JPA无关的数据库字符串比较,java,mysql,jpa,jpql,Java,Mysql,Jpa,Jpql,我正在使用JPA(Hibernate作为提供者)和底层MySQL数据库 我有一张桌子,上面有德国所有街道的名字。每个街道名称都有一个唯一的编号。对于一项任务,我必须找出名字的编号。为此,我编写了一个JPQL查询,如下所示 "SELECT s FROM Strassencode s WHERE s.name = :name" 不幸的是,在德国,有些街道名称只有小写和大写字母的区别,如“Am kleinen Feld”和“Am kleinen Feld”。很明显,其中一个是语法错误的,但作为街道的

我正在使用JPA(Hibernate作为提供者)和底层MySQL数据库

我有一张桌子,上面有德国所有街道的名字。每个街道名称都有一个唯一的编号。对于一项任务,我必须找出名字的编号。为此,我编写了一个JPQL查询,如下所示

"SELECT s FROM Strassencode s WHERE s.name = :name"
不幸的是,在德国,有些街道名称只有小写和大写字母的区别,如“Am kleinen Feld”和“Am kleinen Feld”。很明显,其中一个是语法错误的,但作为街道的名称,两种拼写都是允许的,而且它们都有不同的编号

当我将JPQL查询发送到数据库时,我使用

query.getSingleResult();
由于这个事实,表中的每个街道名称都是唯一的。但是对于底层的MySQL数据库,我将得到一个
ununiqueresultexception
,因为默认情况下MySQL数据库是不区分大小写的比较。强制mySQL的常用方法是编写如下查询

SELECT 'abc' LIKE BINARY 'ABC';
如mySQL参考手册第11.5.1章所述,但JPQL中没有相应的关键字

我的第一次尝试是用

@Column(nullable = false, columnDefinition = "varbinary(128)")
通过这样的注释,数据库会自动进行区分大小写的比较,因为其中一个字符串是二进制的。但是,当我使用这个解决方案时,当我从数据库中读取名称并将其写入文件时,我会遇到麻烦,因为像ä,ö,ü这样的字母会被错误地解释

我知道,
name
字段应该得到一个uniqueConstraint,这是我的目标之一,但这只有在数据库进行区分大小写的字符串比较时才可能实现

有没有一种解决方案,我可以将JPA配置为进行区分大小写的字符串比较,而无需手动微调数据库?

要保持“独立”,正如您所说,对于数据库和JPA提供程序,我将避免使用getSingleResult()并获取列表()并在内存中匹配名称。也许你会得到不止一个,但不是100个或更多


另一种方法是在新字段中保存规范化的名称(修剪为小写)。

您还可以编写
SQL
查询。这就像一个普通的查询:

Query sqlQuery = session.createSqlQuery("select * from CITY where name like binary :name').addString('name', name);

请注意,代码大致完成。

似乎无法配置JPA来解决此问题。但我发现,不仅可以在表级别设置排序规则,还可以为整个数据库设置排序规则,如和中所述

我只需使用以下内容创建数据库:

CREATE DATABASE db_name CHARACTER SET latin1 COLLATE latin1_general_cs;
这样,我就可以在字段
name
上设置一个uniqueConstraint,并插入“Am kleinen Feld”和“Am kleinen Feld”,当我查询其中一个时,我只会收到一个


不过,感谢您对本机查询的帮助

“我不再独立于数据库”,或者您的建议符合ANSI标准吗?这对我来说不是一个“好东西”。这可能是,如果我必须在几个月内切换到Oracle数据库,并且我不想在必要时更改代码。那么我会选择Petermm建议。当我将街道名称标准化时,我会有更多的事实,两个名称是否相等?“Am kleinen Feld”和“Am kleinen Feld”标准化后都会将它们改为“amkleinenfeld”,但数字仍然不同。你说“表中的每个街道名称都是唯一的”。有一条街道,你可以写“Milkyway”或“Milkyway”,但你的db只有一条。当“银河”在数据库中时,您不能再添加“Milkyway”,对吗?您的示例是可能的,因为在版本上包含空格,而另一个不包含空格。但当“银河”已经在里面的时候,我希望“银河”可以被插入,但另一个“银河”不能。当我查询一个版本时,我只想收到一个结果。换句话说,我希望该列的行为类似于Java中
字符串的
集合,其中
为“银河”。equals(“银河”)
false
CREATE DATABASE db_name CHARACTER SET latin1 COLLATE latin1_general_cs;