7

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

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

parameters是一个Map存储所有请求参数的地方。虽然Clob直接从数据库中检索数据类型,但这样的事情是entityObj.getCatImage()行不通的。

看到这个这个问题,但找不到方法。

以下是使用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在这种情况下,数据库中的字段只存储一个图像文件名。

4

5 回答 5

9

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

如果 Clob 的字符数少于 2147483647(又名Integer.MAX_VALUE),您可以这样做

Clob clob = ... //Your clob
String clobString = clob.getSubString(0, clob.length());
于 2012-08-14T02:29:33.233 回答
3

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);
    }
}
于 2016-10-20T12:14:56.640 回答
0

这可能有效

new BufferedReader(new InputStreamReader(catImage.getAsciiStream())).readLine()
于 2015-08-10T07:36:15.553 回答
0

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

我正在使用 JPA 获取数据库数据。我保存为字符串的实体字段。在 SO Object(POJO) 中,我将该字段类型设置为 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;
    }

希望这可以帮助!!!

于 2018-04-09T09:10:39.383 回答
0

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

new BufferedReader(new InputStreamReader(clob.getAsciiStream())).lines().collect(Collectors.joining());
于 2018-10-18T15:20:07.557 回答