4

Java 1.7/スプリング 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)

どういう意味ですか?

4

3 に答える 3

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);
} 
于 2012-12-24T16:15:49.110 に答える
2

あなたのコードは のサブクラスを使用しているようですBeanPropertyMapper。提供されたクラスを Java Bean として扱い、デフォルト コンストラクターを呼び出してインスタンス化し、セッターを呼び出してプロパティを設定します。java.math.BigDecimalデフォルトのコンストラクターがなく、それが失敗する場所です。

queryForObject(String sql, Class<T> requiredType, Object... args)代わりにメソッドを使用する必要があります。

于 2012-12-24T16:18:52.860 に答える
1

これは間違いなく機能します

JdbcTemplate t = new JdbcTemplate(ds);
BigDecimal id = t.queryForObject("select id from bank where id=1", BigDecimal.class);
于 2012-12-24T16:55:28.657 に答える