mybatis查詢(xún)oracle long類(lèi)型的踩坑記錄
mybatis查詢(xún)oracle long類(lèi)型的坑
問(wèn)題描述
最近在開(kāi)發(fā)中,遇到查詢(xún)oracle long類(lèi)型異常的問(wèn)題,需求是查詢(xún)一個(gè)字段中含有函數(shù)的索引的內(nèi)容,然后通過(guò)mybatis獲取返回的內(nèi)容封裝成對(duì)象,其中l(wèi)ong類(lèi)型在對(duì)象中用String接收,COLUMN_EXPRESSION字段為long類(lèi)型,供后續(xù)業(yè)務(wù)使用,自定義查詢(xún)語(yǔ)句如下
select a.COLUMN_EXPRESSION, a.COLUMN_POSITION from USER_IND_EXPRESSIONS a inner join USER_IND_COLUMNS b on b.INDEX_NAME = a.INDEX_NAME and b.TABLE_NAME = a.TABLE_NAME and b.COLUMN_POSITION = a.COLUMN_POSITION where b.COLUMN_NAME like 'SYS_NC%$'
報(bào)錯(cuò):Cause: java.sql.SQLException: 流已被關(guān)閉 ; uncategorized SQLException for SQL []; SQL state [99999]; error code [17027]; 流已被關(guān)閉
解決辦法
如果可以修改字段類(lèi)型情況下,建議改成BLOB,CLOB,NLOB,非常不建議使用LONG;
在無(wú)法修改字段類(lèi)型情況下,一定要將LONG類(lèi)型字段放在查詢(xún)字段的最后(COLUMN_EXPRESSION放在最后),例如
select a.COLUMN_POSITION, a.COLUMN_EXPRESSION from USER_IND_EXPRESSIONS a inner join USER_IND_COLUMNS b on b.INDEX_NAME = a.INDEX_NAME and b.TABLE_NAME = a.TABLE_NAME and b.COLUMN_POSITION = a.COLUMN_POSITION where b.COLUMN_NAME like 'SYS_NC%$'
收獲:
Oracle中如果是數(shù)值,用NUMBER替換LONG,如果是大對(duì)象可以用BLOB,CLOB,NLOB替換LONG;其實(shí)查詢(xún)時(shí)還可以通過(guò)存儲(chǔ)過(guò)程將LONG轉(zhuǎn)成VARCHAR2返回,個(gè)人不建議使用存儲(chǔ)過(guò)程。
mybatis處理Oracle中的LONG字段
當(dāng)使用mybatis查詢(xún)oracle中帶有LONG數(shù)據(jù)類(lèi)型的時(shí)候,實(shí)體類(lèi)使用的是String類(lèi)型來(lái)接收.
一般會(huì)報(bào)兩種錯(cuò)誤:
- 1.無(wú)效字段類(lèi)型
- 2.流已被關(guān)閉
處理方法
第一種方式:不使用LONG類(lèi)型(廢話(huà))
第二種方式:自定義函數(shù)將LONG類(lèi)型轉(zhuǎn)換為VARCHAR類(lèi)型(百度,方法一大堆,都是)
第三種方式:首先在Mapper.xml文件中自定義resultMap映射關(guān)系,將LONG類(lèi)型字段的jdbcType設(shè)置為L(zhǎng)ONGVARBINARY
<resultMap id="BaseResultMap" type="com.libstar.tc.dto.Biblios" > ? ? <result column="name" property="bookrecno" jdbcType="VARCHAR" /> ? ? <result column="content" property="content" jdbcType="LONGVARBINARY" /> </resultMap>
然后自定義SQL查詢(xún)數(shù)據(jù),在寫(xiě)SQL的時(shí)候要注意了,將LONG類(lèi)型的那個(gè)字段寫(xiě)在最后,像這樣
SELECT ID,NAME,CONTENT FROM XXX;其中CONTENT字段為L(zhǎng)ONG類(lèi)型字段.
即可成功~
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
深入理解Java class文件格式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
對(duì)于理解JVM和深入理解Java語(yǔ)言, 學(xué)習(xí)并了解class文件的格式都是必須要掌握的功課2017-06-06Java實(shí)現(xiàn)深度優(yōu)先搜索(DFS)和廣度優(yōu)先搜索(BFS)算法
深度優(yōu)先搜索(DFS)和廣度優(yōu)先搜索(BFS)是兩種基本的圖搜索算法,可用于圖的遍歷、路徑搜索等問(wèn)題。DFS采用棧結(jié)構(gòu)實(shí)現(xiàn),從起點(diǎn)開(kāi)始往深處遍歷,直到找到目標(biāo)節(jié)點(diǎn)或遍歷完整個(gè)圖;BFS采用隊(duì)列結(jié)構(gòu)實(shí)現(xiàn),從起點(diǎn)開(kāi)始往廣處遍歷,直到找到目標(biāo)節(jié)點(diǎn)或遍歷完整個(gè)圖2023-04-04Springboot項(xiàng)目對(duì)數(shù)據(jù)庫(kù)用戶(hù)名密碼實(shí)現(xiàn)加密過(guò)程解析
這篇文章主要介紹了Springboot項(xiàng)目對(duì)數(shù)據(jù)庫(kù)用戶(hù)名密碼實(shí)現(xiàn)加密過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06springboot+jwt+微信小程序授權(quán)登錄獲取token的方法實(shí)例
本文主要介紹了springboot+jwt+微信小程序授權(quán)登錄獲取token的方法實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03淺談web服務(wù)器項(xiàng)目中request請(qǐng)求和response的相關(guān)響應(yīng)處理
這篇文章主要介紹了淺談web服務(wù)器項(xiàng)目中request請(qǐng)求和response的相關(guān)響應(yīng)處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07