2016-04-04 13 views
0

私はSonarQubeと私のコードをスキャンしていると私は、次のバグを取得しています:SonarQube非定数文字列

-A準備文は上の方法を実行するために渡された非定数文字列 -Nonconstant文字列から生成されます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()); 
} 
Iは、最終文字列を渡す試み

= sql.toString()。 prepareStatement()関数に渡しても、バグが生成されます。

答えて

1

SQLコマンドを連結でアセンブルするという問題は、どのテーブルを更新するか、どの列を設定するか、どの値を挿入するかなどです。

テーブルと列をハードコードし、その値にパラメータバインドを使用する方法があります。

+0

残念ながら、特定の条件を満たす場合にのみクエリに追加するため、列をハードコードできません。唯一のソリューションはハードコーディングですか? –

関連する問題