Closed
Description
Rob Winch opened SPR-13220 and commented
The following code
int i = jdbcTemplate.queryForObject(sql,int.class);
produces
org.springframework.dao.TypeMismatchDataAccessException: Type mismatch affecting row number 0 and column type 'null': Value [22] is of type [java.lang.Integer] and cannot be converted to required type [int]
at org.springframework.jdbc.core.SingleColumnRowMapper.mapRow(SingleColumnRowMapper.java:101)
at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:93)
at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:60)
at org.springframework.jdbc.core.JdbcTemplate$1QueryStatementCallback.doInStatement(JdbcTemplate.java:459)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:404)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:470)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:480)
at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:490)
at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:496)
Instead, Spring should convert the Integer to an int.
Migrating from Spring 4.1 to 4.2
This bug is much more apparent now that Spring 4.2 removed methods like int queryForInt(String sql)
. It seems that many users may update the following Spring pre 4.2 code:
int i = jdbcTemplate.queryForInt(sql);
to be
int i = jdbcTemplate.queryForObject(sql, int.class);
which would produce the above TypeMismatchDataAccessException
. Obviously one could easily do:
int i = jdbcTemplate.queryForObject(sql, Integer.class);
to workaround the issue.
Affects: 4.2 RC2
Issue Links:
- Remove pre-3.2 deprecated classes and methods [SPR-12578] #17179 Remove pre-3.2 deprecated classes and methods