簡體   English   中英

JdbcTemplate不支持參數化查詢“ IN”的情況? 必須通過NamedParameterJdbcTemplate嗎?

[英]JdbcTemplate does not support Parameterized Query 'IN' case? Must by NamedParameterJdbcTemplate?

為了防止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可以進行案例查詢?

非常感謝。

正如我在評論中已經提到的那樣,我對這種解決方案不滿意,因為它動態生成了許多SQL語句。 給定userRights的數量在1到n之間,則在緩存中最多需要n條准備好的語句。

下面應該工作(我沒有嘗試過)。

String employeeId = 'D2309';
String name = "%brady%";

List<Integer> userRights = new ArrayList<Integer>();
userRights.add(1);
userRights.add(2);
userRights.add(3);

// build the input string
StringBuilder sb = new StringBuilder();
for (int i = 0; i < userRights.size; i++) {
    sb.append("?");
    if (i < userRights.size() - 1) {
        sb.append(", ");
    }
}

// build the SQL
String sql = "SELECT * FROM T_EMPLOYEE WHERE EMPLOYEE_ID = ?" +
    " AND NAME LIKE ?" +
    " AND RIGHT IN (" + sb.toString() + ")";

// init the object array
// size is employeeId + name + right
Object[] param = new Object[2 + userRights.size()];

// fill it
param[0] = employeeId;
param[1] = name;

for (int i = 0; i < userRights.size(); i++) {
    param[i + 2] = userRights.get(i);
}

jdbcTemplate.query(sql, param, new EmployeeRowMapper());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM