2017-07-14 58 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查詢,該查詢將返回一個列表結果集,其類型在編譯時不爲人知。因此,列表中的每個元素代表一條記錄。