SQL インジェクション攻撃を防ぐために、プロジェクト内のすべての SQL ステートメント コードをパラメーター化クエリに変換する必要があります。しかし、クエリ条件に「IN」ケースが含まれていると問題が発生しました。このように (DB2 データベースを使用):
String employeeId = 'D2309';
String name = "%brady%";
List<Integer> userRights = new ArrayList<Integer>();
userRights.add(1);
userRights.add(2);
userRights.add(3);
String sql = "SELECT * FROM T_EMPLOYEE WHERE EMPLOYEE_ID = ? AND NAME LIKE ?
AND RIGHT IN (?)";
jdbcTemplate.query(sql, new Object[] {employeeId, name, userRights}, new
EmployeeRowMapper());
上記のコードの実行は、次の例外で失敗しました。
org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad
SQL grammar [SELECT * FROM T_EMPLOYEE WHERE EMPLOYEE_ID = ? AND NAME LIKE ? AND
RIGHT IN (?)]; nested exception is com.ibm.db2.jcc.am.io: [jcc][1091][10824]
[3.57.82] .... ERRORCODE=-4461, SQLSTATE=42815
ここでの質問は、JdbcTemplate が IN ケースのパラメーター化されたクエリをサポートしていないということですか? そして、この作業は NamedParameterJdbcTemplate で実行できることを知っています。また、NamedParameterJdbcTemplate のみが IN ケース クエリを実行できるかどうかを知っていますか?
どうもありがとう。