Java 使用setString()从字符串转换为Clob无效

Java 使用setString()从字符串转换为Clob无效,java,jdbc,derby,clob,Java,Jdbc,Derby,Clob,我正在尝试将字符串转换为Clob以存储在数据库中。我有以下代码: Clob clob = connection.createClob(); System.out.println("clob before setting: " + clob); clob.setString(1,"Test string" ); System.out.println("clob after setting: " + clob); System.out.println("clob back to string: "

我正在尝试将字符串转换为Clob以存储在数据库中。我有以下代码:

Clob clob = connection.createClob();
System.out.println("clob before setting: " + clob);
clob.setString(1,"Test string" );
System.out.println("clob after setting: " + clob);
System.out.println("clob back to string: " + clob.toString());
当我运行此命令时,没有设置Clob,输出如下:

clob before setting: org.apache.derby.impl.jdbc.EmbedClob@1f5483e
clob after setting: org.apache.derby.impl.jdbc.EmbedClob@1f5483e
clob back to string: org.apache.derby.impl.jdbc.EmbedClob@1f5483e

无论我在哪里看到使用setString方法,我都不知道为什么这对我不起作用。

您不需要中间
Clob
实例,只需在
PreparedStatement
上使用
setString()

PreparedStatement stmt = connection.prepareStatement("insert into clob_table (id, clob_column) values (?,?)";
stmt.setInt(1, 42);
stmt.setString(2, "This is the CLOB");
stmt.executeUpdate();
connection.commit();

不确定它是否适用于derby,但对于hibernate,您可以使用:

public Clob createClob(org.hibernate.Session s, String text) {
    return s.getLobHelper().createClob(text);
}

从System.out.println语句中读取的内容并不表示Clob中实际发生的情况。您只需读取Clob的默认java.lang.Object.toString()方法,在本例中,该方法输出实例ID,无论您在其中输入了什么,它都不会改变

您正在正确地使用Clob将字符串加载到其中,但没有读回字符串值。要从clob读取字符串值,请使用

Clob clob = connection.createClob();
clob.setString(1,"Test string" );
String clobString = clob.getSubString(1, clob.length())
System.out.println(clobString);

顺便说一句:如果您使用的是大字符串,您确实希望将字符串转换为Clob,如果字符串大于Oracle varchar2限制,并且您发送了一个简单的字符串,那么它可能会截断输入或放大。如果Oracle进程调用Clob,请给它一个

您只需在
PreparedStatement
上使用
setString()
。无需创建中间
Clob
实例。@BugalugsNash:您错误地假设Clob.toString()返回Clob内容。事实并非如此。因此,调试输出无助于诊断问题。我不确定您是否有任何问题。@a_horse_与_no_name我试图将一行插入到一个以Clob为数据类型的表中,因此我使用一个带有变量“?”的预处理语句,然后尝试将Clob绑定到该变量。我不明白你的建议,但我认为它不适用于我。@Codo我如何访问clob内容?toString()方法是google建议的,它返回一个字符串,所以我没有看到我说过的问题:没有必要使用
Clob
实例<直接在语句上使用code>setString()就可以了。看看我的答案。