2012-08-14 26 views
6

हाइबरनेट (3.2.1.GA) में, मैं ओआरकल (10 जी) डेटाबेस में सीएलओबी प्रकार डेटा डालने के लिए निम्न विधि का उपयोग करता हूं।एक सीएलओबी डेटा प्रकार को हाइबरनेट में स्ट्रिंग में कैसे परिवर्तित करें?

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

parameters एक Map जहां सभी अनुरोध पैरामीटर संग्रहीत किया गया है। डेटाबेस से Clob डेटा प्रकार को पुनर्प्राप्त करते समय सीधे इस entityObj.getCatImage() की तरह कुछ काम नहीं करेगा।

देखा this और this प्रश्न लेकिन कोई रास्ता नहीं मिल सका।

निम्नलिखित इकाई है जो 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

परिभाषित करें 'काम नहीं करेगा।' क्या आपको कोई त्रुटि मिल रही है या क्या यह 'शून्य' लौट रहा है? – Dev

+0

@Dev - यह कोई त्रुटि नहीं देता है। यह किसी ऑब्जेक्ट संदर्भ को इस तरह की 'org.hibernate.lob.SerializableClob @ 1e2ad75' या तो' obj.getCatImage()। ToString() 'या' obj.getCatImage() 'के साथ वास्तविक सामग्री दिखाने के बजाए कुछ ऑब्जेक्ट संदर्भ दिखाता है। ओरेकल डेटाबेस में छवि फ़ाइल का नाम। 'चयन * श्रेणी से' जैसे ओरेकल प्रॉम्प्ट पर वास्तविक एसक्यूएल हालांकि ओरेकल टर्मिनल पर सीधे एक्टौल सामग्री दिखाता है। – Tiny

उत्तर

9

या तो वांछित String मिलता है या Clob.getAsciiStream() या Clob.getCharacterStream() का उपयोग कर एक InputStream या रीडर के रूप में CLOB पढ़ने के लिए उचित तर्क के साथ Clob.getSubString(long, int) कहते हैं।

CLOB की तुलना में कम 2147483647 (उर्फ Integer.MAX_VALUE) कैरेक्टर हैं, तो आप इस

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

'getSubString()': पहला अक्षर स्थिति 1 पर है, 0 नहीं, अजीब तरह से, लेकिन जावाडोक – dzieciou

+1

कहता है कि प्रारंभिक संस्करण में स्थिति 0 से शुरू हुई। इसके अलावा, दोनों पैरामीटर int (clob। लंबाई() लंबे समय तक लौटती है ताकि आपको इसे भी परिवर्तित करने की आवश्यकता हो)। –

0

यह काम हो सकता है

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

देव (ऊपर देखें) का उपयोग करने के लिए "CLOB से समाधान कर सकते हैं। getSubString (लंबा, 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); 
    } 
}