2017-07-14 48 views
2

读取CLOB列我有一个表在数据库,其中一列(STATUS)的数据类型是CLOB.I需要读取状态如何在Oracle数据库从Java

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 

我怎样才能读取DB CLOB数据并将其转换字符串?

+0

你试图存储什么数据?你为什么使用CLOB? – Ravi

+0

我会认为使用PreparedStatement - > resultSet然后使用https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#getClob(int)会更好 –

+0

也是你的表说'STATUS',但你的SQL说'SELECT STATUS_DESCRIPTION' –

回答

3

以下是更正后的版本,并解释出现下面的代码:

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查询,该查询将返回一个列表结果集,其类型在编译时不为人知。因此,列表中的每个元素代表一条记录。