【问题标题】:How to strip accents in JPA Criteria API如何去除 JPA Criteria API 中的重音符号
【发布时间】:2018-02-19 10:34:32
【问题描述】:

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

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

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

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

builder.like(builder.lower(join.get(myTable.lib)),"%" + search.toLowerCase() + "%"));

我该如何解决这个问题?

【问题讨论】:

  • this question 的副本
  • @senape 你能告诉我为什么这个问题是重复的吗?如何在 JPA SingularAttribute 上使用 StringUtils.stripAccents 函数??

标签: java sql jpa jpa-criteria


【解决方案1】:

试试这个:

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

【讨论】:

  • 我收到此错误:The method function(String, Class<T>, Expression<?>...) in the type CriteriaBuilder is not applicable for the arguments (String, Class<String>, Path<String>, String)
  • join 是什么?
  • 连接变量的类型为Join
  • CriteriaBuilder函数方法的第三个参数是Expression的Arbitrary Number of Arguments,所以String参数不适用于这个方法是正常的,第四个参数应该是这样的:@987654326 @ 和:typedQuery.setParameter("param", "US7ASCII");
  • 顺便说一下,这里的代码使用了供应商特定的函数convert,因此它不能移植到没有相同功能的数据库中
【解决方案2】:

方法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 排序规则将确保重音字符与非重音字符一样进行排序和比较,最重要的是,您的搜索不需要任何附加功能查询。

【讨论】:

  • 所以假设search 字符串等于"mét" 并且数据库中的值等于'métier' 在这种情况下term 字符串等于"met" 所以这不会获取任何数据,因为数据库中的值包含重音,请阅读我的问题,我说我想使用 JPA Criteria API 而不是在 JAVA 中去除重音,我在发布此问题之前已经进行了谷歌搜索。
  • 对不起,我误会了。让我考虑一下,我会尽力提供更多帮助:)
  • 你使用的是什么数据库?
  • 我使用什么数据库并不重要,因为JPA是Java规范,代码应该适用于任何数据库和JPA实现。
  • 我在问,因为默认情况下,MySQL 会忽略搜索中的变音符号/重音符号。因此,如果您的查询是 select * from myTable where myCol like %met% 并且您有 métiermètiermetier,它将返回所有这些。无论如何,我们需要澄清你的问题的目的。如果它是纯粹的学术或现实生活。因为在后一种情况下,我强烈建议您不要在查询中使用函数以及类似“% term %”的查询,因为它们会严重影响数据库性能。向我们提供有关您的问题的更多信息,我很乐意为您提供帮助。
猜你喜欢
  • 2012-01-01
  • 2011-07-20
  • 1970-01-01
  • 2016-10-20
  • 2016-06-25
  • 2020-10-12
  • 2011-12-11
  • 2011-06-16
相关资源
最近更新 更多