如何在JPA Criteria API中去除重音

时间:2018-02-19 10:34:32

标签: java sql jpa jpa-criteria

我正在使用JPA Criteria API,我想选择我有一个像给定字符串这样的列数据的事件,这就是我在SQL中的做法:

 lower(CONVERT(myTable.lib, 'US7ASCII')) like lower('%'+myString+'%')

例如,我有myTable.Lib = 'métier'行,所以当myString的值为'met'时,它应该选择返回该行,因为在这种情况下CONVERT(myTable.Lib, 'US7ASCII')将返回{ {1}}。

这就是我建立标准的方式:

'metier'

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

试试这个:

builder.like(builder.lower(builder.function("convert",String.class,join.get(myTable.lib),builder.literal("US7ASCII"))),"%" + search.toLowerCase() + "%"));

答案 1 :(得分:-1)

方法CONVERT(..., ...)不是ANSI SQL标准语法,但它是ODBC,以及US7ASCII字符集Oracle's doc

标准语法为CONVERT(... USING ...)

第二个问题是数据库在转换时的行为方式。

如果您在Oracle DB上运行简单查询

select CONVERT('àèìòù', 'US7ASCII') from DUAL;

你会收到

aeiou

由于缺少US7ASCII字符集,因此无法运行MySQL中的相同查询。根据Oracle的文档,它的标准对应物是ASCII,但不幸的是简单查询

select CONVERT("àèìòù" USING ASCII)

返回null

现在,考虑到问题,正如我之前所说,使用函数搜索数据是一个非常糟糕的主意,因为它会极大地影响您的查询性能。 在我看来,你应该为你的表选择正确的整理

collation是字符排序和比较的方式。对表(或列或数据库)使用欧洲排序规则或utf8排序规则将确保重音字符的排序和比较与非重音字符相同,最重要的是,您不需要任何其他功能来搜索查询。