【问题标题】:Spring JdbcTemplate query parameters type error: Invalid column typeSpring JdbcTemplate 查询参数类型错误:无效的列类型
【发布时间】:2012-11-10 17:35:29
【问题描述】:

我就是这样使用 Spring Jdbc 模板的:

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 是 nate 列(例如“user_id”) sord 是 asc/desc

不传递参数时(只执行

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

) 一切正常。

更新:适用于:

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

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

Spring MapSqlParameterSource 和命名参数似乎有问题。我使用 Spring 3.1.3

数据库是 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   

【问题讨论】:

    标签: oracle spring jdbc spring-jdbc


    【解决方案1】:

    我认为问题在于您的 order by 子句, 您正在尝试动态更改您的 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);
    

    希望对你有帮助。

    【讨论】:

    • 刚刚发现那个错误。(+1)根据这个问题stackoverflow.com/questions/10064860/…你不能将参数绑定到sql词。所以我改变了我的代码,我会更新我的问题。但还是有异常...
    • 修改,使用了MapSqlParameterSource中的Type参数。
    【解决方案2】:

    试试这个

    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;
    }
    

    }

    【讨论】:

    • 那行得通。当我不传递任何参数并且只执行 SELECT user_id, username FROM users 时就可以了。但我想传递参数。执行queryForList时抛出异常,因此循环部分并不重要(我假设)
    猜你喜欢
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    相关资源
    最近更新 更多