3

在 JPA 中,执行本机查询时,我必须将反斜杠字符转义为双反斜杠。例如,当有一个 where 子句时

UPPER(app.NAME) like UPPER(?) escape '\'

然后我需要创建一个字符串,其中包含:

UPPER(app.NAME) like UPPER(?) escape '\\'

然后我使用 openJPA 2.2.2 运行本机查询:

final EntityManager entityManager = EntityManagerFinder.getEntityManager();
final Query query = entityManager.createNativeQuery(sql, Response.class);

SQL 语句是从 XML 文件中读取的,因此这里没有进行 Java 转义。此外,我在调试过程中验证了 Java 中的字符串与 XML 文件中的字符串完全相同。

为什么 JPA 期望本机查询使用双反斜杠?这是 openJPA 中的错误吗?

4

1 回答 1

2

@Neil:这是一个很好的暗示,它可能是特定于数据库的,而不是特定于 JPA 的。使用 Oracle 11gR2,我发现:Oracle 文本查询中的特殊字符

“要转义反斜杠转义字符,请使用 \。”

但是,我不明白为什么在使用 JPA 时需要转义反斜杠,但在 PL/SQL Developer 中,我绝不能转义。如果我在 PL/SQL Developer 中转义反斜杠,我会收到一条错误消息。

而且openJPA的trace log显示了以'\'作为'\'提交的SQL,相当混乱。

关于 JDBC:Oracle JDBC 文档/LIKE Escape Characters提到:

“如果要将反斜杠字符()用作转义字符,则必须输入两次,即\。例如:”

ResultSet rset = stmt.executeQuery("SELECT empno FROM emp
            WHERE ename LIKE '\\_%' {escape '\\'}");

这是一个简单的 Java 转义,Java 内部会产生一个反斜杠字符。

我还必须在正则表达式中转义,不仅在 LIKE 中:

SELECT regexp_replace(
  listagg(h.node_id, ',') WITHIN GROUP (ORDER BY h.node_id),
  '([^,]+)(,\1)+', '\1') as node_ids

所以我仍然感到困惑,因为它既没有在 JPA 跟踪日志中也没有在 PL/SQL 开发人员中执行它时被转义。JPA 跟踪应该是发送到 DB 驱动程序的 SQL。

于 2015-12-02T08:41:56.793 回答