Spring 如何在Hibernate中将CLOB数据类型转换为字符串?
在hibernate(3.2.1.GA)中,我使用以下方法将CLOB类型的数据插入Oracle(10g)数据库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.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());