尝试插入空值时弹簧的mybatis出错

时间:2014-10-12 22:49:31

标签: java spring oracle11g mybatis

我正在尝试执行此插入:

@Insert("" +
            "insert into EXTRANET.EX_ENTIDAD (ENT_REFNUM, ENT_TIPO, REG_PUB_ID, OFIC_REG_ID, AREA_REG_ID, " +
            "COD_LIBRO, NUM_PARTIDA, ANO_TITU, NUM_TITU, ENT_TRIGGER, TMSTMP_CREA, PRIORIDAD) " +
            " values (EXTRANET.EX_ENTIDAD_SEQ.nextval, #{entTipo}, " +
            "#{regPubId}, #{oficRegId}, #{areaRegId}, #{codLibro}, #{numPartida}, #{anoTitu}, " +
            " #{numTitu}, 'SYNC', SYSDATE, #{prioridad})")
    public int insertEntidades(Map map);

但如果某些#{param}为NULL,我会收到错误:

引起:org.apache.ibatis.type.TypeException:使用JdbcType NULL将参数#1设置为null时出错。尝试为此参数设置不同的JdbcType或不同的jdbcTypeForNull

我正在搜索一些解决方案并读取我必须配置属性:jdbcTypeForNull

然后我在Spring中更新我的配置:

@Bean
public SqlSessionFactoryBean sqlSessionFactory() throws Exception,Throwable  {
    SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
    sessionFactory.setDataSource(getDataSource());
    //sessionFactory.setConfigLocation( new ClassPathResource("gob.pe.sunarp.extranet.config.config.xml"));
    sessionFactory.setTypeAliasesPackage("gob.pe.sunarp.extranet.dao.beans");
    final Properties sqlSessionFactoryProperties = new Properties();
    sqlSessionFactoryProperties.put("jdbcTypeForNull", "NULL");
    sessionFactory.setConfigurationProperties(sqlSessionFactoryProperties );

    return sessionFactory;
}

但错误仍在继续。

我找到了许多xml解决方案,但我只使用java接口 关于这个错误的一些想法?

3 个答案:

答案 0 :(得分:3)

根据MyBatis documentation

  

对于所有可为空的列,JDBC都需要JDBC Type,如果将null作为值传递。您可以通过阅读PreparedStatement.setNull()方法的JavaDoc来自行调查。

您是否为参数设置了jdbcType?例如:

#{property,javaType=int,jdbcType=NUMERIC}

documentation所示,设置jdbcTypeForNull可能不适用于您的驱动程序。

  

当没有为参数提供特定的JDBC类型时,指定空值的JDBC类型。某些驱动程序需要指定列JDBC类型,但其他驱动程序需要使用泛型值,如NULL,VARCHAR或OTHER。

答案 1 :(得分:0)

尝试类似的东西

Map<String, Object> map = new HashMap<>();
map.put("entTipo", (Long) null);

insertEntidades(map);

答案 2 :(得分:0)

如果你想要一个全局设置......就像这样

在Java代码中

sqlSessionFactoryProperties.put("jdbcTypeForNull", JdbcType.DATE);

或在mybatis-config.xml中

<configuration>
    <settings>
        <setting name="jdbcTypeForNull" value="DATE" />             
    </settings>    
</configuration>

这样您就可以插入/更新任何DATE列。

我建议使用mybatis-config.xml解决方案以避免单元测试出现问题