2012-08-14 77 views
6

在hibernate(3.2.1.GA)中,我使用以下方法將CLOB類型的數據插入Oracle(10g)數據庫。如何將CLOB數據類型轉換爲Hibernate中的字符串?

Hibernate.createClob(parameters.get("txtCatImage")); 

parameters是所有請求參數已經被存儲在Map。雖然直接從數據庫中檢索Clob數據類型,但是像這樣的entityObj.getCatImage()不起作用。

看到thisthis的問題,但無法找到方法。

以下是使用Clob類型屬性的實體。

public class Category implements java.io.Serializable { 

    private Long catId; // Primary key. 
    private Clob catImage; // CLOB type field. 
    // Other fields. 
    private static final long serialVersionUID = 1L; 

    public Category() {} 

    // Overloaded constructs + getters + setters + hashcode() + equals() + toString(). 
} 

在數據庫中的Clob場只是存儲的圖像文件名,在這種情況下。

+0

定義「不起作用」。你是否收到錯誤或是否返回'null'? – Dev 2012-08-14 01:39:45

+0

@Dev - 它不會給出任何錯誤。它只是用'obj.getCatImage()。toString()'或'obj.getCatImage()'顯示一個像這個'org.hibernate.lob.SerializableClob @ 1e2ad75'的對象引用,而不是顯示實際的內容, Oracle數據庫中的圖像文件名稱。 Oracle提示符上的實際SQL像'SELECT * FROM category'一樣直接顯示Oracle終端上的實際內容。 – Tiny 2012-08-14 02:30:41

回答

9

要麼調用Clob.getSubString(long, int)使用相應的參數,以獲得所需String或使用Clob.getAsciiStream()Clob.getCharacterStream()閱讀的Clob作爲InputStream或Reader。

如果Clob中的少於2147483647(又名Integer.MAX_VALUE)字符,你可以做到這一點

Clob clob = ... //Your clob 
String clobString = clob.getSubString(0, clob.length()); 
+6

'getSubString()':第一個字符位於位置1,不奇怪,但這是JavaDoc所說的 – dzieciou 2013-12-09 16:44:31

+1

在早期版本中,位置從0開始是可能的。另外,兩個參數都必須是int(clob。 length()返回很長,所以你也需要將其轉換)。 – 2015-12-16 16:19:29

0

這可能會實現

new BufferedReader(new InputStreamReader(catImage.getAsciiStream())).readLine() 
2

從開發(見上文)使用「的CLOB解決方案。 getSubString(long,int)「將花費大量內存。 我更喜歡以下解決方案。

private static String getAsString(Clob clob) { 
    Reader reader = null; 
    BufferedReader bufferedReader = null; 
    try { 
     reader = clob.getCharacterStream(); 
     bufferedReader = new BufferedReader(reader); 
     return IOUtils.toString(bufferedReader); 

    } catch (Exception e) { 
     throw new RuntimeException("Error while reading String from CLOB", e); 
    } finally { 
     IOUtils.closeQuietly(reader); 
     IOUtils.closeQuietly(bufferedReader); 
    } 
} 
相關問題