【问题标题】:How to convert strings to ASCII in QueryDSL?如何在 QueryDSL 中将字符串转换为 ASCII?
【发布时间】:2015-09-23 07:46:56
【问题描述】:

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

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

用 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'))

likeoperator 的两边都转换为小写字母和 ?US7ASCII` 字符集,从而消除了重音符号。请注意,双方都是由数据库本身转换的,使用相同的函数。可以说,它使搜索“不区分重音”。

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

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

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

【问题讨论】:

    标签: java oracle hibernate jpa querydsl


    【解决方案1】:

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

    1. 使用休眠代替 JPA
    2. 创建额外的列,您将在其中存储无变音符号的数据(顺便说一句,据我了解,您的索引也会在那里更好地工作)
    3. 不要对这个查询使用 querydsl,而是手动生成它……

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

    【讨论】:

    • 我们最终得到了您描述的解决方案(编号 2)。我希望避免它,但使用 JPA 上的 QueryDSL 似乎是不可能的,而且这个查询很复杂,无法手动干净地生成。
    猜你喜欢
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    相关资源
    最近更新 更多