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

Java 如何在QueryDSL中将字符串转换为ASCII?,java,oracle,hibernate,jpa,querydsl,Java,Oracle,Hibernate,Jpa,Querydsl,我有一个使用UTF-8的Oracle数据库。我发出了一些搜索查询,使用like谓词按某个名称列进行过滤 由于表中的数据是法文和德文名称,它们可能包含重音字符,如áäèèèö等 用JPQL编写的类似的谓词如下所示(我简化为只保留相关部分): 转换为Oracle方言后,将生成以下SQL: lower(convert(items4_.SSI_ITEM, 'US7ASCII')) like lower(convert('%'||?||'%', 'US7ASCII')) like运算符的两侧都转换为小写

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

由于表中的数据是法文和德文名称,它们可能包含重音字符,如
áäèèèö

用JPQL编写的
类似的
谓词如下所示(我简化为只保留相关部分):

转换为Oracle方言后,将生成以下SQL:

lower(convert(items4_.SSI_ITEM, 'US7ASCII')) like lower(convert('%'||?||'%', 'US7ASCII'))
like
运算符的两侧都转换为小写和?US7ASCII`字符集,从而消除重音。请注意,双方都由数据库本身使用相同的函数进行转换。可以这么说,它使搜索“不区分重音”

现在,它可以很好地工作,并用于一个相对简单的查询,该查询返回字段自动完成的名称

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


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

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

  • 使用hibernate而不是JPA
  • 创建一个额外的列,在那里你可以存储不带变音符号的数据(顺便说一句,据我所知,你的索引在那里也会工作得更好)
  • 不要对此查询使用querydsl,而是手动生成它

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

    我们最终得到了您描述的解决方案(第2个)。我本来希望避免这种情况,但在JPA上使用QueryDSL似乎是不可能的,而且这种查询非常复杂,需要手工干净地生成。
    lower(convert(items4_.SSI_ITEM, 'US7ASCII')) like lower(convert('%'||?||'%', 'US7ASCII'))