Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在JPA本机查询中需要转义反斜杠?_Jpa_Escaping_Openjpa_Nativequery - Fatal编程技术网

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

为什么在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

在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中的一个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