2012-08-14 84 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); 
    } 
} 
相关问题