SQL语句中的SonarQube非常量字符串

时间:2016-04-04 13:50:44

标签: sonarqube

我正在使用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()函数,它仍然会生成错误。

1 个答案:

答案 0 :(得分:1)

引发的问题是您正在使用串联组装SQL命令:要更新哪个表,要设置哪些列以及要放入哪些值。

您应该找到一种方法来对表和列进行硬编码,并对值使用参数绑定。