我正在使用SonarQube扫描我的代码,并且我收到以下错误:
- 从非常量字符串生成预准备语句 - 传递给SQL语句的执行方法的非常量字符串
我有一个基于某些条件我追加的SQL查询。
示例:
PreparedStatement ps = null;
StringBuilder sql = new StringBuilder("UPDATE" + tableName + " SET some_field = ? WHERE a_field = a_value");
if (myObject.getField1() != null) {
sql.append(" AND Field1 = " + myObject.getField1());
}
if (myObject.getField2() != null) {
sql.append(" AND Field2 = " + myObject.getField2());
}
if (myObject.getField3() != null) {
sql.append(" AND Field3 = " + myObject.getField3());
}
if (myObject.getField4() != null) {
sql.append(" AND Field4 = " + myObject.getField4());
}
...
**ps = connection.prepareStatement(sql.toString());** //generating bug
if (myObject.getSomeField() == null) {
ps.setNull(1, nevermind);
} else {
ps.setString(1, myObject.getSomeField());
}
我尝试传递最终的String = sql.toString();到prepareStatement()函数,它仍然会生成错误。
答案 0 :(得分:1)
引发的问题是您正在使用串联组装SQL命令:要更新哪个表,要设置哪些列以及要放入哪些值。
您应该找到一种方法来对表和列进行硬编码,并对值使用参数绑定。