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

老紫竹 2008-07-25 02:52:43
出问题的原文地址如下:http://www.java2000.net/p7354
我这里把代码贴一下:

  @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


...全文
6687 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
changxianbest 2011-12-05
  • 打赏
  • 举报
回复
楼主的头像有个性。
lianlinyu 2011-04-20
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 java2000_net 的回复:]

感谢大家,我已经知道原因了。竟然被我不幸言重了。
我一直用JPA,用了有快1年了,果然是为了兼容JPA.
http://www.java2000.net/p7516 这里我也贴一下
------------------------------------------

关于在Hibernate里使用select count(*) 返回值的问题说明
由于我使用的是Hibernate 3……
[/Quote]

但是我用的是hibernate3.0,对于这个错误还是java.math.BigInteger cannot be cast to java.lang.Long???
Music杰 2011-04-13
  • 打赏
  • 举报
回复
hibernate配置了什么就是什么!!
duqiangcise 2011-03-09
  • 打赏
  • 举报
回复
直接弄成Number,然后自己拿出来想怎么转就怎么转(int,long).
list8477 2010-06-11
  • 打赏
  • 举报
回复
你可以 返回值.class 看看到底什么类型。
千里冰封820 2008-07-25
  • 打赏
  • 举报
回复
推荐一个方法,
  @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
Ami121 2008-07-25
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 linsongbin1 的回复:]
select count(*)。。。
返回的是Long类型的,
我用mysql时是这样的。
[/Quote]

我用Integer 接收没有报错
maodie007 2008-07-25
  • 打赏
  • 举报
回复
是的 我觉得Long本来就要比integer 明智
integer的最大值才21亿多
而long有 9223372036854775807

我是在想他为什么要把Integer变为Long
这个有原因吗?
javabuddy 2008-07-25
  • 打赏
  • 举报
回复
换了3.2的包,果如紫竹所言
顶竹老大!
呵呵
javabuddy 2008-07-25
  • 打赏
  • 举报
回复
。。。。
我的jar包还没下好呢
呵呵
老紫竹 2008-07-25
  • 打赏
  • 举报
回复
感谢大家,我已经知道原因了。竟然被我不幸言重了。
我一直用JPA,用了有快1年了,果然是为了兼容JPA.
http://www.java2000.net/p7516 这里我也贴一下
------------------------------------------

关于在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();

wangxiaoyes7816 2008-07-25
  • 打赏
  • 举报
回复
我用的LONG
javabuddy 2008-07-25
  • 打赏
  • 举报
回复
下个3.2的包试试
老紫竹 2008-07-25
  • 打赏
  • 举报
回复
补充一下,我的数据库用的 MySQL

我想count(*) 这个应该没有关系吧,呵呵!!
Sam_Deep_Thinking 2008-07-25
  • 打赏
  • 举报
回复
select count(*)。。。
返回的是Long类型的,
我用mysql时是这样的。
mike1980 2008-07-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 AWUSOFT 的回复:]
hibernate2 是int的,hibernate3.0开始我都用long了
[/Quote]

正解。
竹子散分吧!
rainscoco 2008-07-25
  • 打赏
  • 举报
回复
Integer
radeonxhl 2008-07-25
  • 打赏
  • 举报
回复
这个应该是跟数据库有关的
DB2是返回java.lang.Long
MySQL返回java.math.BigInteger
其它数据库不知道
小雨转晴 2008-07-25
  • 打赏
  • 举报
回复
dgqbcht 2008-07-25
  • 打赏
  • 举报
回复
测试代码:

public void countAllSubject() {
this.session = this.sessionFactory.getSessionFactory().openSession();
this.session.beginTransaction();
System.out.println(session.createQuery("select count(*) from User").iterate().next().getClass());

}
public static void main(String args[]) {
BaseDAO b=new BaseDAO();
b.countAllSubject();
}

显示结果

15:07:51,046 INFO Environment:479 - Hibernate 3.1.3
15:07:51,062 INFO Environment:509 - hibernate.properties not found
15:07:51,062 INFO Environment:525 - using CGLIB reflection optimizer
15:07:51,078 INFO Environment:555 - using JDK 1.4 java.sql.Timestamp handling
15:07:51,140 INFO Configuration:1308 - configuring from resource: /hibernate.cfg.xml
15:07:51,140 INFO Configuration:1285 - Configuration resource: /hibernate.cfg.xml
15:07:51,390 INFO Configuration:469 - Reading mappings from resource: pojo/hbm/authority.hbm.xml
15:07:51,500 INFO HbmBinder:309 - Mapping class: pojo.Authority -> authority
15:07:51,515 INFO Configuration:469 - Reading mappings from resource: pojo/hbm/character.hbm.xml
15:07:51,546 INFO HbmBinder:309 - Mapping class: pojo.Character -> characters
15:07:51,546 INFO Configuration:469 - Reading mappings from resource: pojo/hbm/characterAuthority.hbm.xml
15:07:51,578 INFO HbmBinder:309 - Mapping class: pojo.CharacterAuthority -> characterAuthority
15:07:51,593 INFO Configuration:469 - Reading mappings from resource: pojo/hbm/user.hbm.xml
15:07:51,609 INFO HbmBinder:309 - Mapping class: pojo.User -> user
15:07:51,609 INFO Configuration:469 - Reading mappings from resource: pojo/hbm/userCharacter.hbm.xml
15:07:51,625 INFO HbmBinder:309 - Mapping class: pojo.UserCharacter -> usercharacter
15:07:51,640 INFO Configuration:1419 - Configured SessionFactory: null
15:07:51,843 WARN RootClass:210 - composite-id class does not override equals(): pojo.UserCharacter
15:07:51,843 WARN RootClass:215 - composite-id class does not override hashCode(): pojo.UserCharacter
15:07:51,859 WARN RootClass:210 - composite-id class does not override equals(): pojo.CharacterAuthority
15:07:51,859 WARN RootClass:215 - composite-id class does not override hashCode(): pojo.CharacterAuthority
15:07:51,875 INFO DriverManagerConnectionProvider:41 - Using Hibernate built-in connection pool (not for production use!)
15:07:51,875 INFO DriverManagerConnectionProvider:42 - Hibernate connection pool size: 20
15:07:51,875 INFO DriverManagerConnectionProvider:45 - autocommit mode: false
15:07:51,875 INFO DriverManagerConnectionProvider:80 - using driver: com.mysql.jdbc.Driver at URL: jdbc:mysql://127.0.0.1:3306/test
15:07:51,875 INFO DriverManagerConnectionProvider:86 - connection properties: {user=root, password=****}
15:07:52,156 INFO SettingsFactory:77 - RDBMS: MySQL, version: 5.0.22-community-nt
15:07:52,156 INFO SettingsFactory:78 - JDBC driver: MySQL-AB JDBC Driver, version: mysql-connector-java-5.0.8 ( Revision: ${svn.Revision} )
15:07:52,171 INFO Dialect:103 - Using dialect: org.hibernate.dialect.MySQLDialect
15:07:52,171 INFO TransactionFactoryFactory:31 - Using default transaction strategy (direct JDBC transactions)
15:07:52,171 INFO TransactionManagerLookupFactory:33 - No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)
15:07:52,171 INFO SettingsFactory:125 - Automatic flush during beforeCompletion(): disabled
15:07:52,171 INFO SettingsFactory:129 - Automatic session close at end of transaction: disabled
15:07:52,171 INFO SettingsFactory:136 - JDBC batch size: 15
15:07:52,171 INFO SettingsFactory:139 - JDBC batch updates for versioned data: disabled
15:07:52,171 INFO SettingsFactory:144 - Scrollable result sets: enabled
15:07:52,171 INFO SettingsFactory:152 - JDBC3 getGeneratedKeys(): enabled
15:07:52,171 INFO SettingsFactory:160 - Connection release mode: auto
15:07:52,187 INFO SettingsFactory:184 - Maximum outer join fetch depth: 2
15:07:52,187 INFO SettingsFactory:187 - Default batch fetch size: 1
15:07:52,187 INFO SettingsFactory:191 - Generate SQL with comments: disabled
15:07:52,187 INFO SettingsFactory:195 - Order SQL updates by primary key: disabled
15:07:52,187 INFO SettingsFactory:338 - Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory
15:07:52,187 INFO ASTQueryTranslatorFactory:24 - Using ASTQueryTranslatorFactory
15:07:52,187 INFO SettingsFactory:203 - Query language substitutions: {}
15:07:52,187 INFO SettingsFactory:209 - Second-level cache: enabled
15:07:52,187 INFO SettingsFactory:213 - Query cache: disabled
15:07:52,187 INFO SettingsFactory:325 - Cache provider: org.hibernate.cache.EhCacheProvider
15:07:52,187 INFO SettingsFactory:228 - Optimize cache for minimal puts: disabled
15:07:52,187 INFO SettingsFactory:237 - Structured second-level cache entries: disabled
15:07:52,187 INFO SettingsFactory:257 - Echoing all SQL to stdout
15:07:52,203 INFO SettingsFactory:264 - Statistics: disabled
15:07:52,203 INFO SettingsFactory:268 - Deleted entity synthetic identifier rollback: disabled
15:07:52,203 INFO SettingsFactory:283 - Default entity-mode: pojo
15:07:52,234 INFO SessionFactoryImpl:154 - building session factory
15:07:52,250 WARN Configurator:126 - No configuration found. Configuring ehcache from ehcache-failsafe.xml found in the classpath: jar:file:/F:/Program%20Files/MyEclipse%206.0/myeclipse/eclipse/plugins/com.genuitec.org.hibernate.eclipse_6.0.0.zmyeclipse60020070820/myeclipse-data/3.0/lib/ehcache-1.1.jar!/ehcache-failsafe.xml
15:07:52,500 INFO SessionFactoryObjectFactory:82 - Not binding factory to JNDI, no JNDI name configured
Hibernate: select count(*) as col_0_0_ from user user0_
class java.lang.Integer

加载更多回复(11)

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧