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