如何从 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 一个在编译时类型未知的列表结果集。因此,列表中的每个元素代表一条记录。