http://nneverwei.iteye.com/blog/1027611
程序上需要將數據庫Clob字段轉換爲String,傳到前臺顯示。因此對Pojo添加了一個String型中間字段用於Clob的轉換。
問題就出在這裏,我們調用了Hibernate.createClob(xxx)將一個String轉爲Clob用於對象的保存。
但事實上,Hibernate.createClob創建出來的Clob對象與直接從數據庫查詢出來的Clob對象類型是不同的。
數據庫查詢出來的Clob與數據庫驅動實現具體相關。而createClob返回的是ClobImpl(hibernate的實現)。
翻看ClobImpl的源碼,發現hibernate對一些常用的方法,如getSubString(...)等根本沒有實現,而是直接丟一個異常出來(Blob may not be manipulated from creating session).
結論,使用Hibernate.createClob創建的Clob對象可以用於保存,但不適用於進一步的操作。(比如調用clob.getSubString字段)。
注:調用getSubString是爲了將Clob轉換爲String,用於頁面顯示。實際上後來發現了一種替代方案。ClobImpl對getSubString沒有實現,但對getCharacterStream是有實現的,因此可以使用下面的代碼:
- try {
- String tmpStr = "";
- StringBuffer sb = new StringBuffer();
- BufferedReader br = new BufferedReader(bigColOri.getCharacterStream());
- while ((tmpStr=br.readLine())!=null){
- sb.append(tmpStr);
- }
- return sb.toString();
- } catch (java.sql.SQLException e1) {
- e1.printStackTrace();
- return null;
- } catch (java.io.IOException e2) {
- e2.printStackTrace();
- return null;
- }