查询语句:
<select id="selectJingHuaBlogArticleCount" resultMap="result_JingHuaBlog" > <![CDATA[ select * from ( SELECT a.article_id,a.class_id,a.article_title,a.article_content,c.class_name,l.member_register_id,l.member_register_pic,l.member_register_okno FROM article a,ARTICLE_CLASS c,login_information l WHERE a.class_id=c.class_id AND a.member_register_id=l.member_register_id AND a.pick=1 and a.auth=1 )ttt where rownum < $count$ ]]> </select>
映射的结果对象:
<resultMap class="article" id="result_JingHuaBlog"> <result column="article_id" property="articleId" /> <result column="article_content" property="articleContent"/> <result column="class_id" property="articleClass.classId" /> <result column="class_name" property="articleClass.className" /> <result column="article_title" property="articleTitle" /> <result column="member_register_pic" property="loginInformation.memberRegisterPic" /> <result column="member_register_okno" property="loginInformation.memberRegisterOkno" /> <result column="member_register_Id" property="loginInformation.memberRegisterId" /> </resultMap>
是使用iBatis操作oracle数据库时,当你的字段类型为LONG类型的时候,查询出结果的时候会报流已经被关闭,这个问题困扰了我好几个小时,使用最基本的JDBC 对Oracle.Long型可以直接通过ResultSet.getString()读写的,一直就想不通为什么?我知道无论是LONG,CLOB还是BLOB实际上都只是resultset拿一个定位符,LONG和CLOB 就会在getString时侯打开一个流由JDBC转换成String;如果再次读同一个定位符就会得到这个"流已经关闭"的错误信息。不过,我就是检查 来检查去,无论如何发现不了重复执行两次get同一字段的代码。
一直到我使用一个检测代码执行同样的取值时,发现如果在一行resultset中先读其他列然后再读这个Long列就会出同样 的错误。所以只要把上面的结果映射的
<result column="article_content" property="articleContent"/>
拿到最前面就一切正常,但是还是不明白为什么?