Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 如何在Hibernate中将CLOB数据类型转换为字符串?_Spring_Hibernate_Oracle10g_Clob - Fatal编程技术网

Spring 如何在Hibernate中将CLOB数据类型转换为字符串?

Spring 如何在Hibernate中将CLOB数据类型转换为字符串?,spring,hibernate,oracle10g,clob,Spring,Hibernate,Oracle10g,Clob,在hibernate(3.2.1.GA)中,我使用以下方法将CLOB类型的数据插入Oracle(10g)数据库 Hibernate.createClob(parameters.get("txtCatImage")); parameters是存储所有请求参数的Map。直接从数据库中检索Clob数据类型时,类似这样的entityObj.getCatImage()将不起作用 看到了很多问题,但找不到路 以下是使用Clobtype属性的实体 public class Category impleme

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

Hibernate.createClob(parameters.get("txtCatImage"));
parameters
是存储所有请求参数的
Map
。直接从数据库中检索
Clob
数据类型时,类似这样的
entityObj.getCatImage()
将不起作用

看到了很多问题,但找不到路

以下是使用
Clob
type属性的实体

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
字段仅存储图像文件名。

使用适当的参数调用以获取所需的
字符串
,或者使用或作为输入流或读取器读取Clob

如果Clob的字符数少于2147483647(也称为Integer.MAX_VALUE)

Clob clob = ... //Your clob
String clobString = clob.getSubString(0, clob.length());
这可能有用

new BufferedReader(new InputStreamReader(catImage.getAsciiStream())).readLine()
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);
    }
}

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

我使用JPA获取数据库数据。 实体字段我保留为字符串。 在SO对象(POJO)中,我将该字段类型设置为CLOB数据类型

从数据库中提取数据后,数据在实体对象中可用。 要复制到SO对象(CLOB类型)

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


希望这有帮助

您可以使用此选项阅读所有内容:

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

Define'will not work'。您是收到错误还是返回了
null
?@Dev-它不会给出任何错误。它只是显示一个对象引用,类似下面的
org.hibernate.lob。SerializableClob@1e2ad75
使用
obj.getCatImage().toString()
obj.getCatImage()
而不是显示Oracle数据库中图像文件名的实际内容。Oracle提示符上的实际SQL,如
SELECT*FROM category
,直接显示Oracle终端上的actaul内容。
getSubString()
:奇怪的是,第一个字符位于位置1,而不是0,但这是JavaDoc所说的。在早期版本中,位置可能从0开始。另外,这两个参数都必须是int(clob.length()返回long,所以您也需要转换它)。
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;
    }
new BufferedReader(new InputStreamReader(clob.getAsciiStream())).lines().collect(Collectors.joining());