JDBC Spring 4带有枚举的NamedParameterJdbcTemplate

时间:2014-07-30 20:10:53

标签: spring spring-jdbc

我一直非常愉快地使用JdbcTemplate,但后来我确信使用了NamedParameterJdbcTemplate。然而,有时或者所有时间都没有享受到这一点。

假设我有一个Person类,如下所示:

public class Person implements Serializable {

    private int age;
    private String name;
    private long socialId;
    private Gender gender;
    private String email;

    enum Gender {
        MALE, FEMALE
    }

}

我正在尝试插入人员列表,如下所示:

SqlParameterSource[] params 
= SqlParameterSourceUtils.createBatch(personList.toArray());

            getNamedJdbcTemplate().batchUpdate(insertSql, params);

然而,它失败并显示以下信息

PreparedStatementCallback; uncategorized SQLException for SQL [INSERT INTO

at oracle.jdbc.driver.OraclePreparedStatementWrapper.setObject(OraclePreparedStatementWrapper.java:230)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.setObject(DelegatingPreparedStatement.java:169)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.setObject(DelegatingPreparedStatement.java:169)
    at org.springframework.jdbc.core.StatementCreatorUtils.setValue(StatementCreatorUtils.java:402)
    at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:235)
    at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:166)
    at org.springframework.jdbc.core.BatchUpdateUtils.setStatementParameters(BatchUpdateUtils.java:65)
    at org.springframework.jdbc.core.namedparam.NamedParameterBatchUpdateUtils.access$000(NamedParameterBatchUpdateUtils.java:32)
    at org.springframework.jdbc.core.namedparam.NamedParameterBatchUpdateUtils$1.setValues(NamedParameterBatchUpdateUtils.java:48)
    at org.springframework.jdbc.core.JdbcTemplate$4.doInPreparedStatement(JdbcTemplate.java:999)
    at org.springframework.jdbc.core.JdbcTemplate$4.doInPreparedStatement(JdbcTemplate.java:989)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:644)
    ... 41 more

我调试了,可以看到在StatementCreatorUtils类中,如果它是方法中的枚举类型,它总是会失败

private static void setValue(PreparedStatement ps, int paramIndex

代码部分......

else if (sqlType == SqlTypeValue.TYPE_UNKNOWN) {
            if (isStringValue(inValue.getClass())) {
                ps.setString(paramIndex, inValue.toString());
            }

问题

有人可以告诉我任何解决方法吗?或者我需要使用占位符(?)来设置数据的旧方法。

非常感谢

1 个答案:

答案 0 :(得分:4)

让这个工作如下

sqlParameterSource.registerSqlType("gender", Types.VARCHAR);

这很好但是如果我们需要在枚举上调用一个方法那么。让我们说像男性(10),女性(20)这样的枚举的getValue?

我无法在NamedParameterJdbcTemplate

中很好地使用这些枚举

有人希望将来改善这一点吗?

由于