【问题标题】:JDBC Spring 4 NamedParameterJdbcTemplate with enum带枚举的 JDBC Spring 4 NamedParameterJdbcTemplate
【发布时间】:2014-07-30 20:10:52
【问题描述】:

我一直很高兴使用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类中如果是Enum类型的方法总是会失败

private static void setValue(PreparedStatement ps, int paramIndex

部分代码....

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

问题

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

非常感谢

【问题讨论】:

    标签: spring spring-jdbc


    【解决方案1】:

    得到这个工作如下

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

    这很好,但是如果我们需要在枚举上调用方法怎么办。假设 getValue 用于诸如 Male(10)、FEMALE(20) 之类的枚举?

    我无法很好地使用这些枚举 NamedParameterJdbcTemplate

    有人希望在未来改进这一点吗?

    谢谢

    【讨论】:

    • 谢谢,解决了我的问题。另外,您是否碰巧找到了其他解决方案?
    猜你喜欢
    • 2015-12-25
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 2013-06-19
    相关资源
    最近更新 更多