我正在尝试执行此插入:
@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接口 关于这个错误的一些想法?
答案 0 :(得分:3)
对于所有可为空的列,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解决方案以避免单元测试出现问题