2012-08-14 6 views
6

Im Hibernate (3.2.1.GA) verwende ich die folgende Methode, um CLOB-Daten in Oracle (10g) -Datenbank einzufügen.Wie konvertiert man einen CLOB-Datentyp in Hibernate in einen String?

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

parameters ist ein Map wo alle Anforderungsparameter gespeichert wurden. Beim Abrufen des Clob Datentyps von der Datenbank direkt würde so etwas wie entityObj.getCatImage() nicht funktionieren.

Gesehen this und this Fragen, aber konnte den Weg nicht finden.

Folgendes ist die Entität, die eine Clob-Eigenschaft verwendet.

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(). 
} 

Das Clob Feld in der Datenbank speichert nur einen Bilddateinamen, in diesem Fall.

+0

Definieren Sie "würde nicht funktionieren." Erhalten Sie einen Fehler oder wird 'null' zurückgegeben? – Dev

+0

@Dev - Es gibt keinen Fehler. Es zeigt nur eine Objektreferenz wie diese 'org.hibernate.lob.SerializableClob @ 1e2ad75' mit entweder 'obj.getCatImage(). ToString()' oder 'obj.getCatImage()' anstatt den tatsächlichen Inhalt anzuzeigen, der ein ist Bild Dateiname in der Oracle-Datenbank. Das eigentliche SQL in der Oracle-Eingabeaufforderung, wie zum Beispiel 'SELECT * FROM category', zeigt jedoch direkt den actaul-Inhalt auf dem Oracle-Terminal an. – Tiny

Antwort

9

Entweder rufen Clob.getSubString(long, int) mit entsprechenden Argumenten die gewünschte String zu erhalten oder die Clob als Input oder Reader Clob.getAsciiStream() oder Clob.getCharacterStream() zu lesen.

Wenn die Clob weniger als 2147483647 (aka Integer.MAX_VALUE) Zeichen hat, können Sie dies tun

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

'getSubString()': Das erste Zeichen ist an Position 1, nicht 0, seltsam, aber das ist, was JavaDoc sagt – dzieciou

+1

es ist möglich, dass in einer frühen Version die Position von 0 begann. Auch müssen beide Parameter int sein. length() gibt long zurück, also müssen Sie auch das konvertieren). –

0

Diese Arbeit könnte

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

Die Lösung von Dev (siehe oben) zu verwenden „Clob. getSubString (long, int) "wird viel Speicher kosten. Ich bevorzuge die folgende Lösung.

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