如何从 Java 读取 Oracle 数据库中的 CLOB 列
How to read CLOB column in Oracle DataBase from Java
我在数据库中有一个 table,其中列的数据类型 (STATUS) 是 CLOB.I 需要读取该 STATUS
create table STATUS_TABLE
(
STATE_ID number(20,0),
STATUS clob
)
我正在尝试读取如下的 CLOB 列
String getStatus = "SELECT STATUS FROM STATUS_TABLE WHERE STATE_ID="+id;
Query statusResults = session.createSQLQuery(getStatus);
List statusRes = statusResults.list();
if ((statusRes != null) && (statusRes.size() > 0)) {
oracle.sql.CLOB clobValue = (oracle.sql.CLOB) statusRes.get(0);
status = clobValue.getSubString(1, (int) clobValue.length());
log.info("Status->:" + status.toString());
}
并得到错误
java.lang.ClassCastException: $Proxy194 cannot be cast to oracle.sql.CLOB
如何从数据库中读取 clob 数据并将其转换为字符串?
这里是修改后的版本,代码下方有说明:
Query query = session.createSQLQuery("SELECT STATUS FROM STATUS_TABLE WHERE STATE_ID = :param1");
query.setInt("param1", id);
query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
List statusRes = query.list();
if (statusRes != null) {
for (Object object : statusRes) {
Map row = (Map)object;
java.sql.Clob clobValue = (java.sql.Clob) row.get("STATUS");
status = clobValue.getSubString(1, (int) clobValue.length());
log.info("Status->:" + status.toString());
}
}
我在您的代码中看到的问题:
- 您正在使用串联构建原始查询字符串。这会使您容易受到 SQL 注入和其他不良影响。
- 无论出于何种原因,您都试图将 CLOB 转换为
oracle.sql.CLOB
。据我所知 JDBC 将 return 一个 java.sql.Clob
- 您正在执行本机 Hibernate 查询,这将 return 一个在编译时类型未知的列表结果集。因此,列表中的每个元素代表一条记录。
我在数据库中有一个 table,其中列的数据类型 (STATUS) 是 CLOB.I 需要读取该 STATUS
create table STATUS_TABLE
(
STATE_ID number(20,0),
STATUS clob
)
我正在尝试读取如下的 CLOB 列
String getStatus = "SELECT STATUS FROM STATUS_TABLE WHERE STATE_ID="+id;
Query statusResults = session.createSQLQuery(getStatus);
List statusRes = statusResults.list();
if ((statusRes != null) && (statusRes.size() > 0)) {
oracle.sql.CLOB clobValue = (oracle.sql.CLOB) statusRes.get(0);
status = clobValue.getSubString(1, (int) clobValue.length());
log.info("Status->:" + status.toString());
}
并得到错误
java.lang.ClassCastException: $Proxy194 cannot be cast to oracle.sql.CLOB
如何从数据库中读取 clob 数据并将其转换为字符串?
这里是修改后的版本,代码下方有说明:
Query query = session.createSQLQuery("SELECT STATUS FROM STATUS_TABLE WHERE STATE_ID = :param1");
query.setInt("param1", id);
query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
List statusRes = query.list();
if (statusRes != null) {
for (Object object : statusRes) {
Map row = (Map)object;
java.sql.Clob clobValue = (java.sql.Clob) row.get("STATUS");
status = clobValue.getSubString(1, (int) clobValue.length());
log.info("Status->:" + status.toString());
}
}
我在您的代码中看到的问题:
- 您正在使用串联构建原始查询字符串。这会使您容易受到 SQL 注入和其他不良影响。
- 无论出于何种原因,您都试图将 CLOB 转换为
oracle.sql.CLOB
。据我所知 JDBC 将 return 一个java.sql.Clob
- 您正在执行本机 Hibernate 查询,这将 return 一个在编译时类型未知的列表结果集。因此,列表中的每个元素代表一条记录。