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

时间:2015-12-01 15:44:48

标签: jpa escaping openjpa nativequery

在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);

从XML文件中读取SQL语句,因此这里不会进行Java转义。此外,我在调试期间验证了Java中的String与XML文件中的字符串完全相同。

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

1 个答案:

答案 0 :(得分:0)

@Neil:这是一个很好的提示,它可能是特定于数据库的,而不是特定于JPA的。 使用Oracle 11gR2,我发现:Special characters in Oracle Text Queries

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

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

此外,openJPA的跟踪日志显示了SQL,该SQL是随着' \'提交的。作为' \',这非常令人困惑。

关于JDBC: Oracle JDBC documentation / 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。