如何在子句行为中自定义NamedParameterJdbcTemplate?

时间:2014-04-04 15:00:22

标签: java spring enums jdbctemplate

我使用超酷的jdbcTemplate(更具体地说是NamedParameterJdbcTemplate)来运行带有IN子句的查询。我想要查询的列表是枚举,因此我收到错误:“转换中的数据类型不兼容”。

我注意到我用这个枚举查询的每个地方都要调用toString()。有没有办法告诉jdbcTemplate获取列表中对象的String值?

1 个答案:

答案 0 :(得分:2)

我认为你需要某种覆盖:

public class MyNamedParameterJdbcTemplate extends NamedParameterJdbcTemplate {

    public MyNamedParameterJdbcTemplate(final DataSource dataSource) {
        super(dataSource);
    }

    @Override
    public <T> T execute(final String sql, final Map<String, ?> paramMap, final PreparedStatementCallback<T> action) throws DataAccessException {
        final Map<String, Object> newParam = new HashMap<>();
        for (final Map.Entry<String, ?> entry : paramMap.entrySet()) {
            if (entry instanceof Enum<?>) {
                // param is an enum
                newParam.put(entry.getKey(), ((Enum) entry).toString());
            } else {
                newParam.put(entry.getKey(), entry.getValue());
            }
        }
        return super.execute(sql, newParam, action);
    }
}

注意:未经过测试,Guava Maps.transformValues()也是一个选项