2012-08-14 6 views
6

En hibernate (3.2.1.GA), utilizo el siguiente método para insertar datos de tipo CLOB en la base de datos Oracle (10g).¿Cómo convertir un tipo de datos CLOB a una Cadena en Hibernar?

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

parameters es una Map donde se han almacenado todos los parámetros de la petición. Al recuperar el tipo de datos Clob de la base de datos, algo como este entityObj.getCatImage() no funcionaría.

Visto this y this preguntas pero no pudo encontrar el camino.

La siguiente es la entidad que utiliza una propiedad de 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(). 
} 

El campo Clob en la base de datos solo almacena un nombre de archivo de imagen, en este caso.

+0

Definir 'would not work.' ¿Estás recibiendo un error o está devolviendo 'null'? – Dev

+0

@Dev - No da ningún error. Simplemente muestra una referencia de objeto como esta 'org.hibernate.lob.SerializableClob @ 1e2ad75' con' obj.getCatImage(). ToString() 'o' obj.getCatImage() 'en lugar de mostrar el contenido real que es un nombre de archivo de imagen en la base de datos Oracle. Sin embargo, el SQL actual en el indicador de Oracle como 'SELECT * FROM category' muestra los contenidos actaul en el terminal Oracle directamente. – Tiny

Respuesta

9

O llamar Clob.getSubString(long, int) con argumentos apropiados para obtener la deseada String o leer el Clob como un InputStream o Reader mediante Clob.getAsciiStream() o Clob.getCharacterStream().

Si el Clob tiene menos de 2147483647 (Integer.MAX_VALUE aka) caracteres que se pueden hacer esto

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

'getSubString()': El primer carácter está en la posición 1, no en 0, extrañamente, pero esto es lo que JavaDoc dice – dzieciou

+1

es posible que en una versión anterior la posición comenzara desde 0. Además, ambos parámetros deben ser int (clob. length() devuelve long, por lo que necesita convertir eso también). –

0

Esto podría funcionar

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

La solución de Dev (véase más arriba) para usar "CLOB. getSubString (long, int) "costará mucha memoria. Prefiero la siguiente solución.

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