2012-11-10 205 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

我设法让它与没有命名的参数(?)一起工作看到我的更新... –