【发布时间】:2015-11-11 22:55:06
【问题描述】:
我在 MyBatis 中有一个插入语句,在后端使用 Oracle 11g R2 和 Oracle ojdbc6 驱动程序。
我反复得到
java.sql.SQLSyntaxErrorException: ORA-01745: invalid host/bind variable name
但是我看不出是什么导致了问题,我没有使用任何 Oracle 保留关键字。
<insert id="createRecord" parameterType="org.appliication.core.domain.TRRecord"
statementType="PREPARED" useGeneratedKeys="true" keyColumn="ID" keyProperty="id">
INSERT INTO T_TR_PUBLICATION p (
p.TR_UID,
p.TITLE,
p.ITEM_TITLE,
p.COVER_DATE,
p.HAS_ABSTRACT,
p.ISSUE,
p.SORT_DATE,
p.VOLUME,
p.BEGIN_PAGE,
p.END_PAGE,
p.ACCESSION_NO,
p.ISSN,
p.DOI,
p.FUNDING_TEXT
)
VALUES (
#{trUid, jdbcType=NULL},
#{title, jdbcType=NULL},
#{titleItem, jdbcType=NULL},
#{coverDate, jdbcType=NULL},
#{hasAbstract, jdbcType=NULL},
#{issue, jdbcType=NULL},
#{sortDate, jdbcType=NULL}
#{journalVolume, jdbcType=NULL},
#{pageBegin, jdbcType=NULL},
#{pageEnd, jdbcType=NULL},
#{accessionNo, jdbcType=NULL},
#{issn, jdbcType=NULL},
#{doi, jdbcType=NULL},
#{fundingText, jdbcType=NULL}
)
</insert>
【问题讨论】:
-
不知道 MyBatis,但尝试删除
jdbcType=NULL,因为NULL不是用于此目的的有效 JDBC 类型。您不能将值绑定到NULL类型。 -
这个
org.appliication.core.domain.TRRecord包/类路径是否正确? -
@Andreas,如果没有 jdbcType=NULL,MyBatis 将无法工作,因为如果像 String 这样的对象为空,它会映射到 Oracle JDBC 驱动程序无法理解的 JdbcType.OTHER,因此它会抛出异常:UncategorizedSQLException:使用 JdbcType OTHER 为参数 #8 设置 null 时出错。尝试为此参数设置不同的 JdbcType 或不同的 jdbcTypeForNull 配置属性。原因:java.sql.SQLException:无效的列类型
-
@Mastah,我已经确认路径是正确的,实际上我的 IDE 会自动完成路径
-
@greyfox 然后指定您想要的实际类型,例如
VARCHAR。这样,值(“abc”)和 null 都将映射到 JDBC 驱动程序可以理解的类型。但是,我原以为 MyBatis 会检查TRRecord中的字段类型以自动选择正确的类型。
标签: java oracle mybatis spring-mybatis