我想很多人肯定多遇到过这种问题,就是数据库中存得字段类型为clob时,使用hibernate查询的时候,查询出来的结果却是一个clob对象,使用to_char方法在查询的时候转换的话,如果字段长度超过4000,则会报错,如果数据库字段都不超过4000,我想那你数据库设计就有问题了,设置clob类型就没必要了,这个问题网上看了蛮多,但是试过了基本不靠谱,也许是大家的需求不同,今天就自己总结下。下面来详细描述下:
比如:现在创建一张表
<pre name="code" class="sql">create table T_ARTICLE --bean ArticleContent
(CONTENT CLOB,
REMARK VARCHAR2(20),
AUTHOR_ID int
)
crate table T_ARTICLE_FOR_AUTHOR( ---bean:ArticleAuthor
AUTHOR_ID int,
AUTHOR_NAME
)
这里什么主键什么的约束都省掉了,懂的人都懂哈

现在要查所有文章作者和内容,文章类型为clob类型,查询的时候就需要注意了,这里方法有多种分别介绍下,方便以后使用
方法一:使用hibernate的HQL查询,建立VO
String hql = "SELECT New com.test.dly.model.AuthorVO( b.authorName,a.content) FROM ArticleContent a,ArticleAuthor b where a.authorId
= b.authorId";
this.hibernateTemplate.find(hql);这里查出来就是VO对象了,通过getter setter方法就可以取出来clob保存的字符串了
这里应该是可以的没有测试过,但是我想应该是可以的
方法二:使用createSQLQuery这个时候你就会发现问题了。。
select a.CONTENT ,b.AUTHOR_NAME T_ARTICLE
a,T_ARTICLE_FOR_AUTHOR b where a.AUTHOR_ID
= b.AUTHOR_ID ;
这样使用createSQLQuery()的方法的时候你会发现content查询出来会是一个内存地址,那现在问题直到了怎么解决呢,其实也很简单:
这样的话textClob就是你想要的结果了,我想这里要是直接使用sql查询单表T_ARTICLE也是获取不到这个CONTENT的,不过话说回来,单表谁还去用sql哇,用HQL不是更方便么java.sql.Clob clob = (java.sql.Clob)authorList.get(i).get("CONTENT");//强制类型转换 Reader inStreamDoc; String textClob=""; try { inStreamDoc = clob.getCharacterStream(); char[] tempDoc = new char[(int) clob.length()]; inStreamDoc.read(tempDoc); inStreamDoc.close(); textClob = new String(tempDoc); } catch (SQLException e) { logger.error("***Action clob转换String类型失败",e); } catch (IOException e) { logger.error("***Action clob转换String类型失败",e); }

方法三:这个就是使用spring jdbc了 这个当然配置好了,这里配置就省了,需要的朋友百度一堆,自己去搜下吧,直接在dao层使用
jdbc.queryForMap()就可以了,得到的结果同样是满足要求的
本文是结合网上的资源自己总结的,欢迎转载,转载请标明出处
