我有一个使用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 重现上述字符转换?
答案 0 :(得分:2)
很抱歉这么说,但转换功能不兼容JPA。它只对您有用,因为hibernate将您的JPQL解释为HQL。但是QueryDSL仅支持JPA标准(或者你应该使用querydsl而不是hibernate)。 你有几个选择,我看到了:
看起来第二个选项最容易实现 - 只需一个非常简单的SQL迁移,您可以在其中创建其他列,在其中插入规范化数据并为新添加的数据创建触发器以自动转换。