无法使用spring-jdbc以批处理方式存储Enum NamedParameterJdbcTemplate

时间:2015-09-28 08:36:09

标签: java spring enums spring-jdbc jdbctemplate

我遇到了spring-jdbc的枚举问题。我有一个包含枚举值的POJO。我想将字符串值存储在数据库中,而不是序数。我制作了一个DAO并且除了使用namedParameterJdbcTemplate的批处理方法之外它工作得很好(对于jdbcTemplate和BatchPreparedStatementSetter它可以工作,但我更喜欢使用命名参数)。

例如:

public int[] batchUpdate(List<MyPojo> pojos) throws DaoException {
    SqlParameterSource[] parameters = new SqlParameterSource[pojos.size()];

    for (int i = 0; i < pojos.size(); i++) {
        parameters[i] = new BeanPropertySqlParameterSource(pojos.get(i));
    }

    try {
        return namedParameterJdbcTemplate.batchUpdate(SQL_UPDATE, (SqlParameterSource[]) parameters);
    } catch (Exception ex) {
        throw new DaoException(ex);
    }
}

不适用于枚举属性。

我有这个错误:

  

引起:org.h2.jdbc.JdbcSQLException:列的值太长   &#34;状态字符变化(20)NOT NULL&#34;:   &#34;&#39; aced00057e7200466f72672e67656e792e7064702e6669726562697264732e67656e79746f74652e646f6d61696e6d6f64656c2e6265742e4265744465636f6 ...   (258)&#34 ;; SQL语句:UPDATE ... SET ...,status =? WHERE id =? [22001-187]在   org.h2.message.DbException.getJdbcSQLException(DbException.java:345)     在org.h2.message.DbException.get(DbException.java:179)at   org.h2.table.Column.validateConvertUpdateSequence(Column.java:327)at at   org.h2.table.Table.validateConvertUpdateSequence(Table.java:737)at   org.h2.command.dml.Update.update(Update.java:125)at   org.h2.command.CommandContainer.update(CommandContainer.java:78)at   org.h2.command.Command.executeUpdate(Command.java:254)at   org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:157)     在   org.h2.jdbc.JdbcPreparedStatement.executeBatch(JdbcPreparedStatement.java:1183)     在   org.springframework.jdbc.core.JdbcTemplate $ 4.doInPreparedStatement(JdbcTemplate.java:1005)     在   org.springframework.jdbc.core.JdbcTemplate $ 4.doInPreparedStatement(JdbcTemplate.java:989)     在   org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:644)     ... 43更多

MyPojo具有枚举值(状态)。这很奇怪,因为我要存储的枚举字符串已经过验证&#39;不是......已经......&#39;如果我使用JPA,我会使用@Enumerated(EnumType.STRING)作为我的状态字段但是在spring-jdbc上存在这样的东西吗?

此致

1 个答案:

答案 0 :(得分:1)

最后通过注册sql类型来解决:

    for (int i = 0; i < bets.size(); i++) {
        BeanPropertySqlParameterSource bpsps = new BeanPropertySqlParameterSource(pojos.get(i));
        bpsps.registerSqlType("status", Types.VARCHAR);
        parameters[i] = bpsps;
    }