2012-11-10 204 views
1

我使用了Spring JDBC模板道:JdbcTemplate類的查詢參數類型錯誤:無效列類型

public List<User> getUsersForGrid(int rows, int page, String sidx, 
     String sord) { 

    int fromRecord = 0; 
    int toRecord = 0; 
    toRecord = page * rows; 
    fromRecord = (page - 1) * rows; 

    StringBuilder sqlB = new StringBuilder(); 
    sqlB.append("SELECT user_id, username "); 
    sqlB.append("FROM users "); 
    sqlB.append("WHERE :fromRecord <= rownum AND rownum <= :toRecord "); 
    sqlB.append("ORDER BY %s %s "); 

    String sql = String.format(sqlB.toString(), sidx, sord); 

    MapSqlParameterSource params = new MapSqlParameterSource(); 
    params.addValue("fromRecord", fromRecord); 
    params.addValue("toRecord", toRecord); 

    List<Map<String, Object>> rsRows = this.jdbcTemplate.queryForList(sql 
      .toString(),params); 

    List<User> users = new ArrayList<User>(); 
    for (Map<String, Object> row : rsRows) { 
     BigDecimal id = (BigDecimal) row.get("user_id"); 
     String username = (String) row.get("username"); 

     User user = new User(id.intValue(), username); 
     users.add(user); 
    } 

    return users; 
} 

,並得到java.sql.SQLException: Invalid column type

SIDX是列內特( 「USER_ID」 爲例)SORD是ASC /降序

當通過沒有PARAMS(僅執行

 sql.append("SELECT user_id, username "); 
     sql.append("FROM users "); 

)EV一切都好。

更新:兼容於:

sqlB.append("WHERE ? <= rownum AND rownum <= ? "); 

this.jdbcTemplate.queryForList(sql.toString(),new Object[]{fromRecord, toRecord}); 

好像與Spring MapSqlParameterSource和命名參數的問題。我使用Spring 3.1.3

DB是Oracle 11.2

describe users; 
Name       Null  Type                                               
------------------------------ -------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
USER_ID      NOT NULL NUMBER                                               
USERNAME      NOT NULL VARCHAR2(40)                                             
PASSWORD      NOT NULL VARCHAR2(20)                                             
ENABLED      NOT NULL NUMBER 

回答

0

試試這個

List<Map> rows = getJdbcTemplate().queryForList(sql); 
    for (Map row : rows) { 
      BigDecimal id = (BigDecimal) row.get("user_id"); 
      String username = (String) row.get("username"); 
      User user = new User(id.intValue(), username); 
      users.add(user); 
} 

確定試

MapSqlParameterSource namedParameters = new MapSqlParameterSource(); 
namedParameters.addValue("fromRecord", fromRecord); 
namedParameters.addValue("toRecord", toRecord); 
namedParameters.addValue("sidx", sidx); 
namedParameters.addValue("sord", sord); 
return this.getNamedParameterJdbcTemplate().query(query, 
      namedParameters, new UserElementMapper()); 


public class UserMapper implements RowMapper<User> { 

public EmailElement mapRow(ResultSet rs, int rowNum) throws SQLException { 
    User user = new User(); 
    emailElement.setID(rs.getInt("user_id")); 
    emailElement.setUsernameo(rs.getString("username")); 
    return user; 
} 

}

+0

這將工作。當我傳遞任何參數並只執行SELECT user_id時,用戶名FROM用戶沒關係。但我想傳遞參數。當queryForList被執行時引發異常,所以循環部分不重要(我假設) –

2

我認爲這個問題是你的order by c lause, 您正試圖動態更改您的order by子句。 剛剛嘗試

StringBuilder sql = new StringBuilder(); 
    sql.append("SELECT user_id, username "); 
    sql.append("FROM users "); 
    sql.append("WHERE :fromRecord <= rownum AND rownum <= :toRecord "); 
    sql.append("ORDER BY user_id asc "); 

    MapSqlParameterSource params = new MapSqlParameterSource(); 
    params.addValue("fromRecord", fromRecord); 
    params.addValue("toRecord", toRecord); 

如果上述作品,然後而是採用了MapSqlParameterSource爲改變order by條款使用類似

StringBuilder sql = new StringBuilder(); 
    sql.append("SELECT user_id, username "); 
    sql.append("FROM users "); 
    sql.append("WHERE :fromRecord <= rownum AND rownum <= :toRecord "); 
    sql.append("ORDER BY %s %s "); 

    //Format the sql string accordingly 


MapSqlParameterSource params = new MapSqlParameterSource(); 
params.addValue("fromRecord", fromRecord, Types.INTEGER); 
params.addValue("toRecord", toRecord, Types.INTEGER); 

希望它能幫助。

+0

剛剛發現這個錯誤。(+ 1)根據這個問題http://stackoverflow.com/questions/10064860/java-sql- sqlsyntaxerrorexception-ora-01745-invalid-host-bind-variable-name -in你不能將參數綁定到sql單詞。所以我改變了我的代碼,我會更新我的問題。但仍然有例外... –

+0

從控制檯獲取sql並嘗試手動執行它。 –

+0

我設法讓它與沒有命名的參數(?)一起工作看到我的更新... –