这篇文章主要介绍了mybatis查询oracle数据库,当字段类型为long类型的踩坑记录,具有很好的参考价值,记录一下,希望可以帮助到大家。

写在前面,Oracle的Long类型是个深坑,如果实际情况允许更改数据类型,尽量更改为CLOB类型

问题描述:

最近在开发中,遇到查询oracle long类型异常的问题,业务是查询一个表Biz_Ad(广告表),其中有一个字段(Detail)是Long类型,在java实体中用String接收,查询语句如下

Select * From Biz_Ad

很简单,但是报错很以外

org.springframework.jdbc.UncategorizedSQLException: Error attempting to get column 'DETAIL' from result set.  
Cause: java.sql.SQLException: 流已被关闭; 
uncategorized SQLException; SQL state [99999]; 
error code [17027]; 流已被关闭; 
nested exception is java.sql.SQLException: 流已被关闭

网上查了一下,具体为什么会发生错误原因未知,有了解的可以评论告知一下。

解决方案:

第一种方式:不使用LONG类型,修改为CLOB或者Varchar2(推荐)

第二种方式:将查询的字段类型对应的jdbcType修改为LONGVARBINARY,将LONG类型字段显式的放在查询的末尾

    Entity中

    ...省略其他字段,LONG类型的字段放在末尾

    /**
	 * 广告详情(html页)
	 */
	@TableField(jdbcType = JdbcType.LONGVARBINARY)
	private String detail;

Mapper.xml文件中

<resultMap id="BaseResultMap" type="xxx" >
    <result column="id" property="id"  />
    <result column="name" property="name"  />
    <result column="detail" property="detail" jdbcType="LONGVARBINARY" />
</resultMap>

自定义SQL中

SELECT ID,NAME,DETAIL FROM BIZ_AD 

问题解决~,希望这个世界少点坑

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐