使用空值插入查询会抛出异常 - mybatis

时间:2018-01-23 04:29:56

标签: oracle mybatis spring-mybatis

我们正在使用mybatis来完成数据库活动。我在将数据插入数据库时​​面临一个问题。

问题:我在表中有10个字段,只有一个字段不是主键 - 除了所有列都可以为空。 当我尝试仅插入3列时,它会通过以下查询提供异常。如果有任何解决方案可以解决以下问题,请告诉我。

查询:

@Insert("insert into defendant (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10)"
        + " values (#{defendantInfo.c1}, #{defendantInfo.c2}, #{defendantInfo.c3}, #{defendantInfo.c4}, #{defendantInfo.c10}, #{defendantInfo.c5}, #{defendantInfo.c6}, #{defendantInfo.c7}, #{defendantInfo.c8}, #{defendantInfo.c9})")
public void insertInToDefendant(DocumentEntryWrapper doc);

异常:java.sql.SQLException: Invalid column type: 1111 at oracle.jdbc.driver.OracleStatement.getInternalType(OracleStatement.java:3916) ~[ojdbc6-11.2.0.1.0.jar:11.2.0.2.0] at oracle.jdbc.driver.OraclePreparedStatement.setNullCritical(OraclePreparedStatement.java:4541) ~[ojdbc6-11.2.0.1.0.jar:11.2.0.2.0] at oracle.jdbc.driver.OraclePreparedStatement.setNull(OraclePreparedStatement.java:4523) ~[ojdbc6-11.2.0.1.0.jar:11.2.0.2.0] at oracle.jdbc.driver.OraclePreparedStatementWrapper.setNull(OraclePreparedStatementWrapper.java:1281) ~[ojdbc6-11.2.0.1.0.jar:11.2.0.2.0] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_121] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_121] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_121] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_121]

注意:我观察到的是#{defendantInfo.c10} - 这里" defendantInfo.c10"为null,因此我们必须在执行查询之前进行一些检查。但我不确定是否进行了检查。

2 个答案:

答案 0 :(得分:0)

错误表示您正在将1111插入一个列 - 显然 - 不接受4位数字。由于这是Oracle,我要说 - 如果它是VARCHAR2列 - 它会隐式地将其转换为字符串而INSERT不会失败。但是,如果您尝试将其插入到DATE数据类型列中,那么它就不会起作用。

因此,请检查#{defendantInfo.c--}中哪一个包含1111以及您存储它的位置。

此外,将#{defendantInfo.c10}放入c5是否可以?另外,哪一列是主键列?

答案 1 :(得分:0)

这意味着您尝试插入带有null参数的值。您必须显式设置列的jdbcType,该列可以为null,例如:

{myObject.nullableColumn, jdbcType=VARCHAR}