Skip to content

JdbcTemplate.queryForObject(sql, <primitive>.class) produces TypeMismatchDataAccessException [SPR-13220] #17811

Closed
@spring-projects-issues

Description

@spring-projects-issues

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:

Referenced from: pull request #836, and commits e032930

Metadata

Metadata

Assignees

Labels

in: dataIssues in data modules (jdbc, orm, oxm, tx)type: enhancementA general enhancement

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions