gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:15:35 26 4
gpt4 key购买 nike

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

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

用 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` 字符集,从而删除重音符号。请注意,两边都是由数据库本身转换的,使用相同的函数。可以这么说,它使搜索“不区分重音”。

现在,这可以正常工作,并且用于相对简单的查询,该查询返回字段自动完成的名称。

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

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

最佳答案

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

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

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

关于java - 如何在 QueryDSL 中将字符串转换为 ASCII?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32733839/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com