mybatis查询oracle数据库数据异常

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis查询oracle数据库数据异常相关的知识,希望对你有一定的参考价值。

后台打印出日志,sql查询成功了,但是返回查询结果的时候报错了,提示不能讲返回的对象转为framework.generic.dao.Model,求大虾指教

类投射异常,

    检查url,username,password

    检查xml配置文件

    逆向工程用的xml不是用于Oracle的

    数据库连接问题,重启服务

追问

数据库连接没问题,控制台打印出了查询数据成功的日志,就在返回查询结果的那一步跑出异常了

追答

那你dao 136行语句是什么?

追问

那是mybatis框架解析返回值的时候执行的,不是我写的

追答

你逆向工程的generator.xml文件对吗?不要用mysql时的这个文件生成,显示请求失败,应该是文件错了吧

参考技术A 可能是配置的错误追问

项目原来是配置连接的mysql,木有问题,今天试了一下oracle有问题

MyBatis 批量插入包含 BLOB 类型的数据到 Oracle 异常问题分析

背景

本周项目开发过程中,有一个简单的批量插入附件到 Oracle 数据库的功能,DAO 编写测试期间都是用的小文件,BLOB 类型的字段插入正常。

真正联调测试时,上传的都是超过 4000 字节的文件,总是报下列异常:

Cause: java.sql.SQLException: ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值

; uncategorized SQLException; SQL state [72000]; error code [1461]; ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值
; nested exception is java.sql.SQLException: ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值

本文记录这个问题的分析过程,作为网络笔记,以备后续查看!

问题排查

这是一个简单的批量插入,用的是 UNION ALL

<insert id="batchInsert" parameterType="java.util.List">
    INSERT INTO FELE_ATTACHMENT(ID,ATTACHMENT,ATTACHMENT_NAME,ATTACHMENT_SIZE)
    <foreach collection="list" item="tempData" index="index" separator="UNION ALL">
        (SELECT
        #tempData.id,jdbcType=VARCHAR,
        #tempData.attachment,jdbcType=BLOB,
        #tempData.attachmentName,jdbcType=VARCHAR,
        #tempData.attachmentSize,jdbcType=DECIMAL
        FROM DUAL
        )
    </foreach>
</insert>

起先以为是表中一个 Number 类型、存储文件长度字段的问题,去掉它后,插入还是报异常,但是实体字段用 byte[] 类型存储附件二进制流的思路是正确的。

把批量插入换成 MyBatis 的单条插入后,数据也能正常插入,所以确定问题还是在批量插入SQL 语句上。

最终确定了问题原因:批量将 byte[] 保存到 BLOB 字段时,不能使用 Union all ,因为它使用from dual 从虚表查询获取数据。

而从虚表取数据时,如果字段长度介于 2000-4000 之间时,Oracle 会将字段类型转为 Long 类型,原来如此。

问题修正

修改批量插入的方式,使用 begin end 连接批量插入语句:

<insert id="batchInsert" parameterType="java.util.List">
  begin
  <foreach collection="list" item="tempData" index="index" separator =";">
      INSERT INTO FELE_ATTACHMENT(ID,ATTACHMENT,ATTACHMENT_NAME,ATTACHMENT_SIZE)
      VALUES (
      #tempData.id,jdbcType=VARCHAR,
      #tempData.attachment,jdbcType=BLOB,
      #tempData.attachmentName,jdbcType=VARCHAR,
      #tempData.attachmentSize,jdbcType=DECIMAL
      )
  </foreach>
  ;end;
</insert>

启示录

详情解决过程参考了 这篇文章,感谢网友的分享。

以上是关于mybatis查询oracle数据库数据异常的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis 批量插入包含 BLOB 类型的数据到 Oracle 异常问题分析

mybatis怎样批量插入数据到oracle,就算id自动增长问题

Oracle模糊查询CONCAT参数个数无效

MyBatis在Oracle数据库下模糊查询之参数个数无效错误

mybatis oracle 分页+模糊查询

mybatis中的模糊查询,Oracle和MySQL中的concat