分类: Java
2009-03-25 13:43:00
问题描述:
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,则报如下错误
type 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
相关评论:
-----------------------------------------------------------
hibernate2 是int的,hibernate3.0开始我都用long了
-----------------------------------------------------------
这个应该是跟数据库有关的
DB2是返回java.lang.Long
MySQL返回java.math.BigInteger
其它数据库不知道
-----------------------------------------------------------
推荐一个方法,
@Override public int countAllSubject() { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); Number number=((Number) session.createQuery( "select count(*) from Post where idParent=0").iterate().next()); return number.intValue(); }
因为无论是Long还是Integer,还是BigInteger,它们都是Number的子类,所以用Number去cast这个结果是肯定不会错的,然后,最好定义在Number里面这些方法可以统一的返回需要的类型;
byte byteValue()
以 byte 形式返回指定的数值。
abstract double doubleValue()
以 double 形式返回指定的数值。
abstract float floatValue()
以 float 形式返回指定的数值。
abstract int intValue()
以 int 形式返回指定的数值。
abstract long longValue()
以 long 形式返回指定的数值。
short shortValue()
以 short 形式返回指定的数值。
java.lang
类 Number
java.lang.Object
java.lang.Number
所有已实现的接口:
Serializable
直接已知子类:
AtomicInteger, AtomicLong, BigDecimal, BigInteger, Byte, Double, Float, Integer, Long, Short
-----------------------------------------------------------