为什么 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 原生查询中需要转义反斜杠? 的相关文章

  • 如果是 @ConstructorResult,@SqlResultSetMapping 应该放在哪里

    我正在尝试使用jpa的entityManager的createNativeQuery方法映射非实体pojo 通过使用这样的东西 SqlResultSetMapping name ResultMapping classes Construct
  • 转义 \u200b(零宽度空格)和其他非法 JavaScript 字符

    我有一组 JavaScript 对象 我引导到后端模板 以在页面加载时初始化我的 Backbone js 集合 它看起来像这样 作为 Twig 模板 我遇到的问题是某些文本字段包含 u200b 零宽度空格 这会破坏
  • 如何在 JPA 和 Hibernate 中将数据库生成的列值定义为只读字段?

    使用 MariaDB 10 2 可以定义日期时间的默认值 例如创建和最后修改 我应该如何将此列作为只读字段访问 因为这个值应该只在数据库的控制之下 并且不应该从代码中修改 但我想在代码中读取这个属性 这很简单 只需设置insertable
  • 为什么是 ”\?” C/C++ 中的转义序列?

    C C 中有四种特殊的非字母字符需要转义 单引号 双引号 反斜杠 和问号 显然是因为它们有特殊的含义 对于单身char 对于字符串文字 对于转义序列 但为什么是 其中之一 我今天读了教科书上的转义序列表 我意识到我已经never逃脱了 以前
  • JPA EntityManager 缓存

    我有一个实体定义如下 public class Version Id private Long id private String content Transient private Model model 据我所知 当find操作是在实体
  • JPA 支持查询 Postgres JSON 字段

    JPA 是否已经支持处理 JSON 字段的查询 如下所示 select from person where info gt gt age numeric 40 select from person where info gt gt firs
  • 访问运行配置 VM 参数中 eclipse 类路径变量 M2_REPO 的值

    在 eclipse 的运行配置中 为您提供了一组可以在 VM 参数中使用的默认变量 例如container path and env var 我想要访问的是类路径变量 M2 REPO 但看不到这样做的方法 我需要在 VM 参数中指定 jav
  • JPA 的 Hibernate 查询提示

    我一直在尝试为所有可以通过设置的提示找到一个明确的资源Query setHint String Object JPA 中的方法调用 但我一无所获 有人知道一个好的参考吗 See 3 4 1 7 查询提示 http docs jboss or
  • 转义用户数据,无需魔法引号

    我正在研究如何在来自外部世界的数据被用于应用程序控制 存储 逻辑等之前正确地对其进行转义 显然 随着 magic quote 指令在 php 5 3 0 中很快被弃用 并在 php6 中被删除 对于任何想要升级并进入新语言功能 同时维护遗留
  • 如何在 Ruby 中转义单引号?

    我通过一个脚本 不是我的 将一些 JSON 传递到服务器 该脚本接受 JSON 作为字符串 JSON 的某些内容包含单引号 因此我想确保在传递给脚本之前对所有单引号进行转义 我已经尝试过以下方法 gt irb gt 1 9 3p194 00
  • Jpa 复合键可为空列

    我正在使用 Hibernate 的 JPA impl 来对一些表进行建模 我在映射表时遇到问题 没有主键 在 4 列上有唯一索引 其中 3 列可以为空 我尝试破解它并将索引定义为复合 Id 但由于某些列可为空 因此无法正常工作 JPA Hi
  • 具有自定义集合属性的 JPA 投影

    我们正在使用 Spring Data 并尝试使用子查询创建自定义查询 结果投影有一个数组和其他属性 我们的问题在于子查询数组 public interface ProfesionalRepository extends JpaReposit
  • 如何在没有@Transactional的情况下使用Hibernate @Filter?

    我使用 Hibernate Filter 和 Spring Data 为项目中的每个查询添加特定的 where 子句 问题是 只要我对 findAll 方法使用 Transactional 注释 它就可以工作 有什么办法可以避免使用 Tra
  • 在 Eclipse 中生成 POJO 的所有 setXXX 调用?

    我目前正在对 JPA 实体进行大量测试 其中我必须不断调用实体上的 setter 方法 如下所示 myEntity setXXX value myEntity setYYY value myEntity setZZZ value Eclip
  • 转义字符串中的反斜杠

    我想知道什么是转义字符串中的反斜杠而不添加不必要的斜杠的好方法 我的意思是 通常如果我想转义字符串中的反斜杠 最简单的方法是使用String Replace 像这样 string s someString Replace 可以使用正则表达式
  • 使用 Hibernate Envers 的复合表

    我有一个带有复合表的应用程序 其中包含一个额外的列 一切正常 直到我们添加 Hibernate Envers Audited org hibernate MappingException 无法读取 no pack response Resp
  • JPA EntityManager 与 Hibernate - 查找和删除不会从数据库中删除数据

    无法使以下代码正常工作 我有一个JpaTransactionManager txManager自动连接到此测试中 我知道 ID 为 39 的记录does存在 它在交易结束时仍然存在 TransactionStatus status txMa
  • 通过 Python 的 elementtree 替换作为数字字符引用一部分的 & 符号

    我正在使用 Python 的 elementtree 模块来编写一些 XML 我正在使用 Python 2 7 和 3 2 我的一些元素的文本字段包含数字字符引用 然而 一旦我使用 elementtree 的tostring字符引用中的所有
  • @EnableTransactionManagement 的范围是什么?

    我试图了解正确的放置位置 EnableTransactionManagement多个 JavaConfig 上下文的情况下的注释 考虑以下场景 我在 JPAConfig java 和 AppConfig java 中有 JPA 配置以及一组
  • Spring Boot MSSQL Kerberos 身份验证

    目前在我的春季靴子中application properties文件中 我指定以下行来连接到 MSSql 服务器 spring datasource url jdbc sqlserver localhost databaseName spr

随机推荐