如何在Hibernate中将CLOB数据类型转换为String?

时间:2012-08-14 01:21:57

标签: spring hibernate oracle10g clob

在hibernate(3.2.1.GA)中,我使用以下方法将CLOB类型数据插入Oracle(10g)数据库。

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

parametersMap,其中存储了所有请求参数。直接从数据库中检索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字段只存储图像文件名。

5 个答案:

答案 0 :(得分:9)

使用适当的参数调用Clob.getSubString(long, int)以获取所需的String,或使用Clob.getAsciiStream()Clob.getCharacterStream()将Clob作为InputStream或Reader阅读。

如果Clob的字符少于2147483647(a.k.a。Integer.MAX_VALUE),则可以执行此操作

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

答案 1 :(得分:2)

Dev的解决方案(见上文)使用" 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);
    }
}

答案 2 :(得分:0)

这可能有效

{{1}}

答案 3 :(得分:0)

正如亚历克斯所说,clob.getSubString(0,clob.length())也会消耗内存和糟糕的性能。 我有同样的问题,我从DB获取一个巨大长度的varchar2(2000-4000)数据字段。由于这个varchar字段为1分20秒,性能正在放缓。从数据库获取到实体类的速度很快,但是从实体复制到SO对象(或POJO)需要花费大量时间。

我正在使用JPA进行数据库获取。 我保持为String的实体字段。 在SO对象(PO​​JO)中,字段类型I设置为CLOB数据类型。

从DB获取数据后,数据在Entity对象中可用。 要复制到SO对象(CLOB类型),

SOobject.setLongStringField( new SerialClob(entityString.toCharArray()));//Converting String to CLOB

在UI级别,我的SOobject,而不是普通的getter setter方法,我使用如下(Alex的代码)

public String getLongStringField() {
         Reader reader = null;
            BufferedReader bufferedReader = null;
            try {
                reader = longStringField.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);
            }
    }

    public void setLongStringField(Clob longStringField) {
        this.longStringField= longStringField;
    }

希望这会有所帮助!!!

答案 4 :(得分:0)

您可以使用它来阅读所有内容:

new BufferedReader(new InputStreamReader(clob.getAsciiStream())).lines().collect(Collectors.joining());