Spring JdbcTemplate 查询参数类型错误:无效的列类型
Posted
技术标签:
【中文标题】Spring JdbcTemplate 查询参数类型错误:无效的列类型【英文标题】:Spring JdbcTemplate query parameters type error: Invalid column type 【发布时间】: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
【问题讨论】:
【参考方案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)根据这个问题***.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时抛出异常,因此循环部分并不重要(我假设)以上是关于Spring JdbcTemplate 查询参数类型错误:无效的列类型的主要内容,如果未能解决你的问题,请参考以下文章
Spring5学习笔记(12) — “JdbcTemplate 操作数据库(查询 select)”
如何使用 spring 的 jdbcTemplate 在 SQL 查询中指定参数