hibernate操作clob类型的数据问题

本文介绍在Hibernate框架下处理CLOB类型字段的三种方法,包括使用HQL查询建立VO对象、利用createSQLQuery处理CLOB类型及采用Spring JdbcTemplate实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我想很多人肯定多遇到过这种问题,就是数据库中存得字段类型为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
)

这里什么主键什么的约束都省掉了,懂的人都懂哈hibernate操作clob类型的数据问题 - 嘟嘟猪 - 嘟嘟侠
现在要查所有文章作者和内容,文章类型为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查询出来会是一个内存地址,那现在问题直到了怎么解决呢,其实也很简单:

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);
	}


这样的话textClob就是你想要的结果了,我想这里要是直接使用sql查询单表T_ARTICLE也是获取不到这个CONTENT的,不过话说回来,单表谁还去用sql哇,用HQL不是更方便么hibernate操作clob类型的数据问题 - 嘟嘟猪 - 嘟嘟侠

方法三:这个就是使用spring jdbc了 这个当然配置好了,这里配置就省了,需要的朋友百度一堆,自己去搜下吧,直接在dao层使用
jdbc.queryForMap()就可以了,得到的结果同样是满足要求的

本文是结合网上的资源自己总结的,欢迎转载,转载请标明出处hibernate操作clob类型的数据问题 - 嘟嘟猪 - 嘟嘟侠

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值