无法将CLOB转换为字符串

3
我正在尝试将我的Clob对象转换为字符串,以便在我的JSTL页面上显示。为此,我编写了以下代码。
public String convertClobToString(Clob clob){
     String toRet="";
     if(clob!=null)
     {
         try
         {
             long length=clob.length();
             toRet=clob.getSubString(1, (int)length);
         }
         catch(Exception ex)
         {
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
             ex.printStackTrace();
         }
     }
     return toRet;
 }

但是在使用“long length = clob.length()”计算长度时,会抛出以下异常。
java.sql.SQLException: Must be logged on to server

at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
at oracle.jdbc.dbaccess.DBError.check_error(DBError.java:1160)
at oracle.jdbc.ttc7.TTC7Protocol.assertLoggedIn(TTC7Protocol.java:2196)
at oracle.jdbc.ttc7.TTC7Protocol.lobLength(TTC7Protocol.java:2698)
at oracle.sql.LobDBAccessImpl.length(LobDBAccessImpl.java:468)
at oracle.sql.CLOB.length(CLOB.java:214)
at org.hibernate.lob.SerializableClob.length(SerializableClob.java:33)
at com.starcj.cmt.application.dao.ApplicationDaoImpl.convertClobToString(ApplicationDaoImpl.java:110)
at com.starcj.cmt.termsandcondmgmt.dao.TermsAndCondDaoImpl.getAllActiveTermsandcond(TermsAndCondDaoImpl.java:91)
at com.starcj.cmt.termsandcondmgmt.service.TermsAndCondServiceImpl.getAllActiveTermsAndCond(TermsAndCondServiceImpl.java:43)
at com.starcj.cmt.termsandcondmgmt.controller.TermsAndCondListingCMTController.handleRequest(TermsAndCondListingCMTController.java:66)
at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)

异常:必须登录服务器

但我从数据库获取了clob对象


遇到了同样的问题,仍然不明白它是如何发生的。请告诉我你是如何解决它的? - hardPass
3个回答

5
在您的Hibernate实体中(我们看不到),声明属性为String类型并用@Lob进行注释即可(我不知道您是否使用注释或XML),这样就不需要进行任何手动转换。
这是因为在您尝试解析实体时,会话和底层连接已关闭,因此无法从数据库流式传输CLOB的值。
上述解决方案的替代方法可能是使用OpenSessionInView过滤器。它将允许您在呈现视图(即您的JSP)时保持会话(和底层数据库连接)处于打开状态。

2

您从哪里获取CLOB?创建它的连接是否仍然打开? 错误信息似乎表明数据库连接已经关闭了。 如果您正在使用Hibernate,那么Hibernate会话是否仍然打开?


你能正确地编辑你的堆栈跟踪和代码吗?这可以通过在每行前面放置四个空格来完成。 - malaverdiere
我正在使用Oracle 9.0,并且正在使用Hibernate,但是连接没有关闭,同时连接仍然处于打开状态。 - Vipul
连接没有关闭。你能验证一下吗?也许可以尝试使用 hibernateSession.createSQLQuery("select * from dual").executeUpdate() - Thilo

1

Clob resume = Hibernate.createClob("This is Clob");

Clob resume = Hibernate.createClob(“这是Clob”);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接