为什么在JPA本机查询中需要转义反斜杠?
在JPA中,当执行本机查询时,我必须将反斜杠字符转义为双反斜杠。例如,当有where子句时,如为什么在JPA本机查询中需要转义反斜杠?,jpa,escaping,openjpa,nativequery,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.getEntityManage
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中的一个bug吗?@Neil:这是一个很好的提示,它可能是DB特定的,而不是JPA特定的。 使用Oracle 11gR2,我发现: 要转义反斜杠转义字符,请使用\ 然而,我不明白为什么在使用JPA时需要避开反斜杠,但在PL/SQLDeveloper中,我不能避开反斜杠。如果在PL/SQLDeveloper中转义反斜杠,则会收到一条错误消息 此外,openJPA的跟踪日志显示了SQL,它是以“\”作为“\”提交的,这非常令人困惑 关于JDBC: 报告提到: 如果要将反斜杠字符()用作转义字符,则必须输入两次,即\。例如: 这是一个简单的Java转义,Java内部生成一个反斜杠字符 我还必须在正则表达式中转义,而不仅仅是在类似的:
SELECT regexp_replace(
listagg(h.node_id, ',') WITHIN GROUP (ORDER BY h.node_id),
'([^,]+)(,\1)+', '\1') as node_ids
所以我仍然感到困惑,因为无论是在JPA跟踪日志中,还是在PL/SQLDeveloper中执行它时,它都没有被转义。JPA跟踪应该是发送到DB驱动程序的SQL。反斜杠转义是否适用于JDBC驱动程序?因为有些人确实需要它(比如MySQL)。
SELECT regexp_replace(
listagg(h.node_id, ',') WITHIN GROUP (ORDER BY h.node_id),
'([^,]+)(,\1)+', '\1') as node_ids