如何在 QueryDSL 中将字符串转换为 ASCII?

How to convert strings to ASCII in QueryDSL?

我有一个使用 UTF-8 的 Oracle 数据库。我正在发出一些搜索查询,使用 like 谓词按某些名称列进行过滤。

由于table中的数据是法语和德语名称,它们可能包含重音字符,例如àäèüéö等...

用 JPQL 编写的 like 谓词如下所示(我进行了简化以仅保留相关部分):

...where lower(convert(item.value, 'US7ASCII')) like lower(convert(CONCAT('%',:query,'%'), 'US7ASCII'))

一旦转换为 Oracle 方言,将产生以下 SQL:

lower(convert(items4_.SSI_ITEM, 'US7ASCII')) like lower(convert('%'||?||'%', 'US7ASCII'))

like运算符的两边都转换为小写字母和 ?US7ASCII` 字符集,这会删除重音符号。注意,两边都是由数据库自己转换的,使用的是同一个函数。它使搜索 "accent-insensitive",可以这么说。

现在,这工作正常并用于相对简单的查询,returns 为字段的自动完成命名。

但是,主要搜索查询更加复杂和动态(大量连接、动态条件),我正在使用 QueryDSL 来构建它。

是否可以通过 JPA 使用 QueryDSL 重现上述字符转换

很抱歉这么说,但是 convert 函数与 JPA 不兼容。它对你有用只是因为 hibernate 将你的 JPQL 解释为 HQL。但是 QueryDSL 只支持 JPA 标准(或者你应该使用 querydsl 而不是 hibernate)。 如我所见,您有多种选择:

  1. 使用 hibernate 代替 JPA
  2. 创建额外的列,您将在其中存储无变音符号的数据(顺便说一句,据我所知,您的索引在那里也能更好地工作)
  3. 不要为此查询使用 querydsl,而是手动生成它...

看起来第二个选项最容易实现 - 只需一个非常简单的 SQL 迁移,您可以在其中创建额外的列,在其中插入规范化数据并为新添加的数据创建触发器以自动转换。