mysql count integer_关于Hibernate读取select count(*)的返回值到底是Long还是Integer的疑

问题描述:

Java code

@OverridepublicintcountAllSubject() {

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 fulfillingthisrequest.

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.16logs.

但是,有几个网友却是正好相反,他们直接运行报

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@OverridepublicintcountAllSubject() {

Session session=HibernateUtil.getSessionFactory().getCurrentSession();

session.beginTransaction();

Number number=((Number) session.createQuery("select count(*) from Post where idParent=0").iterate().next());returnnumber.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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值