Java 如何在QueryDSL中将字符串转换为ASCII?
我有一个使用UTF-8的Oracle数据库。我发出了一些搜索查询,使用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运算符的两侧都转换为小写
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)。 如我所见,您有几种选择:
看起来第二个选项是最容易实现的-只需一个非常简单的SQL迁移,您可以创建额外的列,在其中插入规范化数据,并为新添加的数据创建触发器以自动转换。我们最终得到了您描述的解决方案(第2个)。我本来希望避免这种情况,但在JPA上使用QueryDSL似乎是不可能的,而且这种查询非常复杂,需要手工干净地生成。
lower(convert(items4_.SSI_ITEM, 'US7ASCII')) like lower(convert('%'||?||'%', 'US7ASCII'))