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

时间:2015-09-23 07:46:56

标签: java oracle hibernate jpa querydsl

我有一个使用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 重现上述字符转换

1 个答案:

答案 0 :(得分:2)

很抱歉这么说,但转换功能不兼容JPA。它只对您有用,因为hibernate将您的JPQL解释为HQL。但是QueryDSL仅支持JPA标准(或者你应该使用querydsl而不是hibernate)。 你有几个选择,我看到了:

  1. 使用hibernate代替JPA
  2. 创建附加列,您可以在其中存储不含变音符号的数据(顺便说一下,根据我的理解,您的索引也会更好地工作)
  3. 请勿对此查询使用querydsl,而是手动生成...
  4. 看起来第二个选项最容易实现 - 只需一个非常简单的SQL迁移,您可以在其中创建其他列,在其中插入规范化数据并为新添加的数据创建触发器以自动转换。