问题根源在于,超长的文本会被转成LONG类型。
一般有四种情况
1、真的搞错类型了
数据库类型是字符,但是java中使用了LONG类型。或者mybatis显式声明了LONG类型。
#{log.test, jdbcType=LONG}
2、数据库是VARCHAR,但是插入的文本超长。
数据库是VARCHAR,java是String,无论是否显示指定VARCHAR,都会报错。因为VARCHAR最长是4000字符。
3、数据库是CLOB或BLOB,但没有显式指定类型。
#{log.test}
直接使用参数,没有指定类型,会提示LONG的错误。因为默认是VARCHAR,超长会转成LONG。
显式指定即可。
#{log.test, jdbcType=CLOB}
4、数据库是CLOB,显示指定了类型,但使用了子查询作为参数。
#{log.test, jdbcType=CLOB}
即使显式制定了类型,且数据库也是CLOB,但是如果sql中使用了子查询作为参数,也会作为VARCHAR处理,超长会被转LONG。
比如:
MERGE INTO LOG target
USING (SELECT #{log.id, jdbcType=VARCHAR} AS id,
#{log.test, jdbcType=CLOB} AS test
FROM dual) src
ON (target.id = src.id)
WHEN MATCHED THEN
UPDATE
SET target.test= src.test
WHEN NOT MATCHED THEN
INSERT (ID,TEST)
VALUES (#{log.id, jdbcType=VARCHAR},#{log.test, jdbcType=CLOB})