疯狂

STANDING ON THE SHOULDERS OF GIANTS
posts - 481, comments - 486, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
我这里把代码贴一下:
  
Java code  @Override
  
public
int countAllSubject() {
    Session session
= HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();
   
return ((Long) session.createQuery(
        
"select count(*) from Post where idParent=0").iterate().next())
        .intValue();
  }



  
在我的机器上,用Long作为返回值,运行正常,如果改成Integer,则报如下错误
Java codetype Exception report

message

description The server encountered an internal error () that prevented it from fulfilling    this
request.

exception

org.apache.jasper.JasperException: java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:
522)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:
416)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:
337)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:
266)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:
803)

root cause

java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
    net.java2000.notepad.service.impl.hibernate.PostServiceHibernateImpl.countAllSubject(PostServiceHibernateImpl.java:
24)
    org.apache.jsp.jsph.index_jsp._jspService(index_jsp.java:
93)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:
70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:
803)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:
374)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:
337)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:
266)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:
803)

note The full stack trace of the root cause is available in the Apache Tomcat
/6.0.16 logs.


  
  
但是,有几个网友却是正好相反,他们直接运行报
  
java.lang.ClassCastException: java.lang.Integer  
  
改成Integer却正常了。
  
  
希望大家使用Hibernate比较熟悉的人,确认一下,大家随意使用 count(*) 然后读取看看,到底是Integer,还是 Long



解决方案:
关于在Hibernate里使用select count(*) 返回值的问题说明
由于我使用的是Hibernate 3.2版本,经确认,这个版本已经把以前返回 Integer的改成了 Long,
因为JPA里面的返回值规定是Long, Hibernate为了兼容这个,所以修改了返回值。
  
如果你从Hibernate 3.0.x/3.1.x升级到最新的3.2版,一定要注意,3.2版的很多sql函数如count(), sum()的唯一返回值已经从Integer变为Long,如果不升级代码,会得到一个ClassCastException。
  
这个变化主要是为了兼容JPA,可以在hibernate.org的最新文档中找到说明。
  
Hibernate Team也提供了一个与原来兼容的解决方案:
  
   Configuration classicCfg = new Configuration();
   classicCfg.addSqlFunction( "count", new ClassicCountFunction());
   classicCfg.addSqlFunction( "avg", new ClassicAvgFunction());
   classicCfg.addSqlFunction( "sum", new ClassicSumFunction());
   SessionFactory classicSf = classicCfg.buildSessionFactory();
当然最好统一转换成Number然后获取

只有注册用户登录后才能发表评论。


网站导航: