为什么 JPA 原生查询中需要转义反斜杠?

2024-02-16

在 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 中的错误吗?


@Neil:这是一个很好的暗示,它可能是特定于数据库的,而不是特定于JPA的。 使用 Oracle 11gR2,我发现:Oracle Text 查询中的特殊字符 http://docs.oracle.com/cd/B28359_01/text.111/b28304/cqspcl.htm

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

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

而且openJPA的跟踪日志显示,将'\'提交的SQL变成了'\',这很令人困惑。

关于 JDBC: 这Oracle JDBC 文档/LIKE 转义字符 https://docs.oracle.com/cd/E11882_01/java.112/e16548/apxref.htm#JJDBC28921提到:

“如果你想使用反斜杠字符()作为转义字符,那么你必须输入两次,即\。例如:”

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 Developer 中执行时转义。 JPA 跟踪应该是发送到数据库驱动程序的 SQL。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 JPA 原生查询中需要转义反斜杠? 的相关文章

随机推荐