2012-08-14 13 views
6

In hibernate (3.2.1.GA), utilizzo il seguente metodo per inserire i dati di tipo CLOB nel database Oracle (10g).Come convertire un tipo di dati CLOB in una stringa in sospensione?

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

parameters è un Map in cui sono stati memorizzati tutti i parametri di richiesta. Mentre il recupero del tipo di dati Clob dal database direttamente qualcosa come questo entityObj.getCatImage() non funzionava.

Visto this e this domande ma non è riuscito a trovare la strada.

Quanto segue è l'entità che utilizza una proprietà di tipo 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(). 
} 

Il Clob campo nel database solo memorizza un nome del file immagine, in questo caso.

+0

Definire "non funzionerebbe". Stai ricevendo un errore o sta restituendo 'null'? – Dev

+0

@Dev - Non dà alcun errore. Mostra solo un riferimento ad un oggetto come questo 'org.hibernate.lob.SerializableClob @ 1e2ad75' con' obj.getCatImage(). ToString() 'o' obj.getCatImage() 'invece di mostrare il contenuto reale che è un nome del file immagine nel database Oracle. L'attuale SQL sul prompt Oracle come 'SELECT * FROM category' mostra comunque i contenuti del terminale Oracle direttamente. – Tiny

risposta

9

O chiamare Clob.getSubString(long, int) con gli argomenti appropriati per ottenere il desiderato String o leggere il Clob come un InputStream o Reader utilizzando Clob.getAsciiStream() o Clob.getCharacterStream().

Se il Clob ha meno di 2147483647 (aka Integer.MAX_VALUE) caratteri si può fare questo

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

'getSubString()': Il primo carattere è in posizione 1, non 0, stranamente, ma questo è ciò che JavaDoc dice – dzieciou

+1

è possibile che in una versione precedente la posizione inizi da 0. Inoltre, entrambi i parametri devono essere int (clob. length() restituisce long quindi è necessario convertire anche questo). –

0

Questo potrebbe funzionare

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

La soluzione da Dev (vedi sopra) per utilizzare "Clob. getSubString (long, int) "costerà molta memoria. Preferisco la seguente soluzione.

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); 
    } 
} 
Problemi correlati