使用springframework, JdbcTemplate对数据库进行查询时, 报出了org.springframework.jdbc.IncorrectResultSetColumnCountException: Incorrect column count: expected 1, actual 2 错误, 详细的Failure Trace如下:
org.springframework.jdbc.IncorrectResultSetColumnCountException: Incorrect column count: expected 1, actual 2
at org.springframework.jdbc.core.SingleColumnRowMapper.mapRow(SingleColumnRowMapper.java:88)
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$1.doInPreparedStatement(JdbcTemplate.java:708)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:644)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:695)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:727)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:737)
at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:805)
at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:824)
at org.springframework.jdbc.core.simple.SimpleJdbcTemplate.queryForObject(SimpleJdbcTemplate.java:159)
at com.apress.springrecipes.bank.JdbcAccountDao.findAccount(JdbcAccountDao.java:28)
at com.apress.springrecipes.bank.AccountServiceImpl.deposit(AccountServiceImpl.java:24)
at com.apress.springrecipes.bank.AccountServiceJUnit38LegacyTests6.testDeposit(AccountServiceJUnit38LegacyTests6.java:28)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at junit.framework.TestCase.runTest(TestCase.java:164)
at junit.framework.TestCase.runBare(TestCase.java:130)
at org.springframework.test.ConditionalTestCase.runBare(ConditionalTestCase.java:79)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:120)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
JdbcTemple.queryForObject 返回值类型是<T> T, 是单行单列一个数据, 也就是只能返回一个字段; 在检查程序后, 发现sql语句写的是SELECT *, 而数据库表里有两列字段, 返回两列, 但是接收时却只有一个列, 就报出了这个incorrect column count的错误.
public Account findAccount(String accountNo) {
String sql = "SELECT * FROM ACCOUNT WHERE ACCOUNT_NO = ?";
double balance = getSimpleJdbcTemplate().queryForObject(sql,
Double.class, accountNo);
return new Account(accountNo, balance);
}
修改后:
public Account findAccount(String accountNo) {
String sql = "SELECT BALANCE FROM ACCOUNT WHERE ACCOUNT_NO = ?";
double balance = getSimpleJdbcTemplate().queryForObject(sql,
Double.class, accountNo);
return new Account(accountNo, balance);
}
再次运行, 一切正常.