【问题标题】:JPA - Run sql NativeQuery of 'insert into' with special charters is failedJPA - 使用特殊字符运行“插入”的 sql 本机查询失败
【发布时间】:2020-11-15 21:29:49
【问题描述】:

我正在使用休眠和 mysql 当我在 mysql 中运行以下语句时,它运行良好:

INSERT INTO table1 (name, is_visited) VALUES ('visit our site \'n\' days',true); 

但是,当我使用休眠本机查询运行时,出现错误: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'days',true)' 附近使用正确的语法。

这里是java代码:

 String query = "INSERT INTO table1 (name, is_visited) VALUES ('visit our site \'n\' days',true)";
    
    Query nativeQuery = getEntityManager().createNativeQuery(query);
    nativeQuery.executeUpdate();

当我将查询语句更改为

 "INSERT INTO table1 (name, is_visited) VALUES ('visit our site \'n days',true)";

它有效。

\'n\' 似乎有问题 有什么想法吗?

【问题讨论】:

  • 能否包含实际的 Java 代码?
  • 我已经添加了。谢谢

标签: mysql hibernate jpa


【解决方案1】:

这里发生的情况是,以下查询在直接在 MySQL 上运行时正确转义了单引号:

INSERT INTO table1 (name, is_visited) VALUES ('visit our site \'n\' days', true);

这适用于 MySQL,因为在 MySQL 上转义文字引号的一种有效方法是用反斜杠转义它们。但是,在 Java 字符串中执行此操作意味着 \' 不会被传递给 MySQL。相反,Java 使用单个反斜杠,并且仅单引号将其传递到数据库。我建议在这里使用另一种转义单引号的方法,即将它们加倍:

String query = "INSERT INTO table1 (name, is_visited) VALUES ('visit our site ''n''x days', true)";

虽然有可能从 Java 中转义反斜杠,但这让我感到困惑,因为它需要跟踪 Java 和数据库层之间的转义。

作为另一个一般性评论,如果您使用 Hibernate ORM 层进行插入,或者使用准备好的语句,则不必担心这个转义问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    相关资源
    最近更新 更多