遇到這樣一個需求:要從oracal中查詢出一個表中的四個字段,其中有兩個字段是clob類型的,在後端需要將其轉換成STRING,才能調用程序內的後續方法;查詢的結果是個結果集,類似下面:
StringBuffer gridSQL = new StringBuffer("select data_area_code,name,XS,YS from map_grids_bak_20190718 where length(data_area_code)=15");
//獲取對象數據集合
//null 的意思是不用給sql語句傳參數
List<Object[]> list = this.getListBySql(gridSQL.toString(),null);
XS,YS是clob類型,然而斷點跟代碼時,發現數組中的clob數據是代理對象,直接強轉成clob時,提示cannot to be oracle.sql.CLOB,找了很多原因,發現原來是導錯包了,不應該用oracle.sql.CLOB包,而是用Java.sql.Clob包才行,真是花了很多時間向一個錯誤方向努力了;
選用正確的包後,直接強轉:
String xs = cn.o.utils.StringUtils.ClobToString((Clob)strings[2]);
String ys = cn.o.utils.StringUtils.ClobToString((Clob)strings[3]);
最後附上工具類轉換的代碼:其實就是用文件流的方法轉換的
public static String ClobToString(Clob clob) {
String reString = "";
Reader is = null;
try {
is = clob.getCharacterStream();
} catch (Exception e) {
e.printStackTrace();
}
// 得到流
BufferedReader br = new BufferedReader(is);
String s = null;
try {
s = br.readLine();
} catch (Exception e) {
e.printStackTrace();
}
StringBuffer sb = new StringBuffer();
while (s != null) {
//執行循環將字符串全部取出付值給StringBuffer由StringBuffer轉成STRING
sb.append(s);
try {
s = br.readLine();
} catch (Exception e) {
e.printStackTrace();
}
}
reString = sb.toString();
return reString;
}