【问题标题】:How to read CLOB column in Oracle DataBase from Java如何从 Java 读取 Oracle 数据库中的 CLOB 列
【发布时间】:2017-12-19 03:18:38
【问题描述】:

我在数据库中有一个表,其中列(状态)的数据类型是 CLOB。我需要读取该状态

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 数据并转换为字符串?

【问题讨论】:

  • 您要存储什么数据??你为什么使用 CLOB?
  • 我认为使用 PreparedStatement -> resultSet 然后使用 docs.oracle.com/javase/7/docs/api/java/sql/… 会更好
  • 你的表也说STATUS,但你的SQL说SELECT STATUS_DESCRIPTION

标签: java hibernate clob


【解决方案1】:

这里是修正后的版本,代码下方有说明:

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。 AFAIK JDBC 将返回 java.sql.Clob
  • 您正在执行本机 Hibernate 查询,这将返回一个列表结果集,其类型在编译时未知。因此,列表中的每个元素代表一条记录。

【讨论】:

    猜你喜欢
    • 2022-07-21
    • 1970-01-01
    • 2021-03-25
    • 2011-04-05
    • 1970-01-01
    • 2011-02-02
    • 2015-03-02
    • 2017-08-29
    • 1970-01-01
    相关资源
    最近更新 更多