Java 尝试插入空值时,mybatis with spring中出现错误

Java 尝试插入空值时,mybatis with spring中出现错误,java,spring,oracle11g,mybatis,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) " + " val

我正在尝试执行此插入:

@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}为空,则我得到了错误:

原因:org.apache.ibatis.type.TypeException:将参数#1设置为null时出错,JdbcType为null。请尝试为此参数设置其他JdbcType或设置其他JdbcType FORNULL

我正在搜索一些解决方案,读到我必须配置一个属性: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接口。
关于这个错误的一些想法?

根据

如果null作为一个值传递,那么JDBC对于所有可为null的列都需要JDBC类型。您可以通过阅读PreparedStatement.setNull()方法的JavaDocs来自行研究这一点

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

#{property,javaType=int,jdbcType=NUMERIC}
如中所示,将jdbcTypeForNull设置可能不适用于您的驱动程序

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


试试那样的

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

insertEntidades(map);
Map Map=newhashmap();
map.put(“entTipo”,(Long)null);
插入数据(map);

如果需要全局设置,请尝试以下方法

在Java代码中

sqlSessionFactoryProperties.put("jdbcTypeForNull", JdbcType.DATE);
或者在mybatis-config.xml中

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

这样,您就可以对任何日期列进行插入/更新


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

Hi@Centinul,我做了一个测试:@Insert(“Insert INTO JOEWEB.PRUEBA(ID,TEXTO)value(#{ID},#{TEXTO,jdbcType=VARCHAR})”)public int insertPrueba(Map Map);插入成功完成。但是我在这个项目中有很多陈述。是否存在解决此问题的全局配置?如果不存在。这周有什么问题!!:(@JoseDiazDiaz,你用的是什么JDBC驱动程序?我用的是ojdbc6.jar。我的Oracle是11.2.0.2。mybatis的版本是3.2.7,mybatis spring 1.2.2,spring 4.0.6。我有500条语句。出于这个原因,我很担心。@JoseDiazDiaz我看到你已经注释掉了你的XML配置。你有没有尝试过使用XML con配置并在那里设置该属性?是的,@Centinul。两个选项都有,什么都没有。我做了测试@eddú-meléndez,但什么都没有。目前只运行#{texto,jdbcType=VARCHAR}。