Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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
Java “如何逃离”'&引用;在sql中_Java_Sql_Hibernate - Fatal编程技术网

Java “如何逃离”'&引用;在sql中

Java “如何逃离”'&引用;在sql中,java,sql,hibernate,Java,Sql,Hibernate,嗨,我正在数据库中搜索名称组合。我通过的组合如下 "firstName='" + firstName + "'", "middleName='" + middleName + "'", "lastName='" + lastName + "'" 这个很好用。但问题是,名字中有一些“”,我怎样才能纠正它呢?例如:Johns's或Jerry's etc导致异常至少对于MySQL,您必须在以下内容之前添加另一个“: INSERT INTO table (column) VALUES ('this i

嗨,我正在数据库中搜索名称组合。我通过的组合如下

"firstName='" + firstName + "'", "middleName='" + middleName + "'", "lastName='" + lastName + "'"

这个很好用。但问题是,名字中有一些“”,我怎样才能纠正它呢?例如:Johns's或Jerry's etc导致异常

至少对于MySQL,您必须在以下内容之前添加另一个

INSERT INTO table (column) VALUES ('this isn''t it');

您可以通过使用反斜杠对SQL中的sinqle引号字符(')进行转义来忽略它们。

尝试以下方法:

firstName = firstName.replace("'" , "''");

改用PreparedStatement,这样会更好。

我想以下方法也可以(至少对MySQL是这样):


使用预先准备好的声明,这对您来说很容易

ps.executeUpdate("INSERT INTO tb_name values(?,?) WHERE id=?");
ps.setString(1,firstName);
ps.setString(2,middleName);
ps.setInt(3,id);
ps.execute();
您可以使用它作为输出

firstName='X',middleName='Y',lastName='Z'

如果您使用的是Hibernate,您应该这样使用:

Query query = session.createQuery("from Something s where s.firstName = :firstName and s.middleName = :middleName and s.lastName = :lastName");
query.setString("firstName", firstName);
query.setString("middleName", middleName);
query.setString("lastName", lastName);

List<?> list = query.list();
Query Query=session.createQuery(“来自s,其中s.firstName=:firstName和s.middleName=:middleName和s.lastName=:lastName”);
query.setString(“firstName”,firstName);
query.setString(“middleName”,middleName);
query.setString(“lastName”,lastName);
List=query.List();
希望这能帮助你!
您可以在和上看到更多信息,为什么不尝试使用
PreparedStatement
?我想是的better@TuTran我希望我能对你的评论多投几次赞成票。发布一个答案!忽略这里所有的字符串操作答案,它们仍然容易受到SQL注入的攻击,这是当今的一个严重问题。我真的建议你读。@Jaison:对不起,你原来的帖子没有提到Hibernate!因此,我建议您使用
PreparedStatement
。有关
Hibernate
No的解决方案,请参阅我的anwser。我的错误是,我将其标记为sql而不是Hibernate。SorryEscaping和反斜杠不适用于SQL-至少在一般情况下是这样。@Johanna说一般使用前面的反斜杠,但也注意到双引号功能。换句话说,两者都有效。这就是为什么它写“一般”。对于MySQL,反斜杠起作用,而对于Oracle则不起作用。Oracle只接受双引号的
。这是hibernate的最佳解决方案(虽然这不是问题的确切答案,但可能是因为他真正需要的原因),如果在尝试使用hibernate saveOrUpdate(object)保存对象时发生此错误,如何修复此错误单引号位于一个字符串中,该字符串是objectNot for Oracle的一个字段-它不起作用=>所以不要在程序中使用它。@Johanna它将转义单引号,但它仍然容易受到SQL注入的攻击。
firstName='X',middleName='Y',lastName='Z'
Query query = session.createQuery("from Something s where s.firstName = :firstName and s.middleName = :middleName and s.lastName = :lastName");
query.setString("firstName", firstName);
query.setString("middleName", middleName);
query.setString("lastName", lastName);

List<?> list = query.list();