在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
字段只存储图像文件名。
答案 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对象(POJO)中,字段类型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());