具有BigDecimal的Spring JDBC queryForObject失败

时间:2012-12-24 16:06:59

标签: java exception spring-jdbc

  

Java 1.7 / Spring 3.1

看看下面的代码。

BigDecimal value = queryAsObject (BigDecimal.class, 
    "select balance from financial.accounts where account_id = ?", accountId);

其中queryAsObject来自一个基本上进行CRUD操作的抽象父类。

public <T> T queryAsObject(Class<T> modelClass, String sql, Object... args) {
        return jdbcTemplate.queryForObject(sql, new HawkBeanPropertyRowMapper<T>(modelClass), args);
    }   

非常直接的春天jdbc调用。但是它导致以下异常:

org.springframework.web.util.NestedServletException: Request processing failed; 
nested exception in org.springframework.beans.BeanInstantiationException: 
Could not instantiate bean class [java.math.BigDecimal]: 
Is it an abstract class?; nested exception is 
java.lang.InstantiationException: java.math.BigDecimal

有根本原因:

org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [java.math.BigDecimal]: Is it an abstract class?; nested exception is java.lang.InstantiationException: java.math.BigDecimal
    org.springframework.beans.BeanUtils.instantiate(BeanUtils.java:81)
    org.springframework.jdbc.core.BeanPropertyRowMapper.mapRow(BeanPropertyRowMapper.java:233)
    org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:92)
    org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:1)
    org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:649)
    org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:587)
    org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:637)
    org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:666)
    org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:674)
    org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:734)

这是什么意思?

3 个答案:

答案 0 :(得分:4)

我认为JdbcTemplate.queryForObject(String sql, RowMapper<T> rowMapper, Object... args)用于将ResultSet绑定到Beans / POJO。

您需要其他重载版本queryForObject(String sql, Class<T> requiredType, Object... args),即

public <T> T queryAsScalar(Class<T> scalarClass, String sql, Object... args) {
        return jdbcTemplate.queryForObject(sql, scalarClass, args);
} 

答案 1 :(得分:2)

您的代码似乎使用了BeanPropertyMapper的子类。它将提供的类视为Java bean,通过调用默认构造函数实例化它,然后通过调用setter来设置属性。 java.math.BigDecimal没有默认构造函数,而且它就是失败的地方。

您应该使用queryForObject(String sql, Class<T> requiredType, Object... args)方法。

答案 2 :(得分:1)

这肯定有效

JdbcTemplate t = new JdbcTemplate(ds);
BigDecimal id = t.queryForObject("select id from bank where id=1", BigDecimal.class);