Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1894527
  • 博文数量: 606
  • 博客积分: 9991
  • 博客等级: 中将
  • 技术积分: 5725
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-17 19:07
文章分类

全部博文(606)

文章存档

2011年(10)

2010年(67)

2009年(155)

2008年(386)

分类: 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,则报如下错误

Java code
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
其它数据库不知道

-----------------------------------------------------------

推荐一个方法,

Java code
@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

-----------------------------------------------------------

阅读(1794) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~