oracle Spring JdbcTemplate 查询参数类型错误:无效的列类型

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/13324382/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-19 01:14:59  来源:igfitidea点击:

Spring JdbcTemplate query parameters type error: Invalid column type

oraclespringjdbcspring-jdbc

提问by Evgeni Dimitrov

I use Spring Jdbc Template that way:

我以这种方式使用 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;
}

and get java.sql.SQLException: Invalid column type

并得到 java.sql.SQLException: Invalid column type

sidx is column nate("user_id" for example) sord is asc/desc

sidx 是列 nate(例如“user_id”) sord 是 asc/desc

When pass no params(execute only

当不传递参数时(只执行

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

) everything is OK.

) 一切都好。

Update: Works with:

更新:适用于:

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

and

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

Seems like problem with Spring MapSqlParameterSource and named parameters. I use Spring 3.1.3

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

DB is Oracle 11.2

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

回答by Sajan Chandran

I think the problem is with your order byclause, you are trying to dynamically change your order byclause. Just try

我认为问题出在您的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);

If the above works, then instead of using the MapSqlParameterSourcefor changing the order byclause use something like

如果上述方法有效,那么不要使用MapSqlParameterSourcefor 更改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);

Hope it helps.

希望能帮助到你。

回答by Juan Rada

try this

尝试这个

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

ok try

好的 试试

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

}

}