JPA - 使用特殊章程运行'insert into'的 sql NativeQuery 失败



我使用hibernate和mysql当我在mysql中运行以下语句时,它运行得很好:

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

然而,当我使用hibernate本机查询运行时,我会收到错误: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'有问题知道吗?

这里发生的事情是,当直接在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层进行插入,或者使用准备好的语句,您就不必担心这个转义问题。

最新更新