Posted on 2011-07-27 17:31
瘋狂 閱讀(2744)
評(píng)論(0) 編輯 收藏 所屬分類:
hibernate
我這里把代碼貼一下:
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();
}
在我的機(jī)器上,用Long作為返回值,運(yùn)行正常,如果改成Integer,則報(bào)如下錯(cuò)誤
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.
但是,有幾個(gè)網(wǎng)友卻是正好相反,他們直接運(yùn)行報(bào)
java.lang.ClassCastException: java.lang.Integer
改成Integer卻正常了。
希望大家使用Hibernate比較熟悉的人,確認(rèn)一下,大家隨意使用 count(*) 然后讀取看看,到底是Integer,還是 Long
解決方案:
關(guān)于在Hibernate里使用select count(*) 返回值的問題說明
由于我使用的是Hibernate 3.2版本,經(jīng)確認(rèn),這個(gè)版本已經(jīng)把以前返回 Integer的改成了 Long,
因?yàn)镴PA里面的返回值規(guī)定是Long, Hibernate為了兼容這個(gè),所以修改了返回值。
如果你從Hibernate 3.0.x/3.1.x升級(jí)到最新的3.2版,一定要注意,3.2版的很多sql函數(shù)如count(), sum()的唯一返回值已經(jīng)從Integer變?yōu)長ong,如果不升級(jí)代碼,會(huì)得到一個(gè)ClassCastException。
這個(gè)變化主要是為了兼容JPA,可以在hibernate.org的最新文檔中找到說明。
Hibernate Team也提供了一個(gè)與原來兼容的解決方案:
Configuration classicCfg = new Configuration();
classicCfg.addSqlFunction( "count", new ClassicCountFunction());
classicCfg.addSqlFunction( "avg", new ClassicAvgFunction());
classicCfg.addSqlFunction( "sum", new ClassicSumFunction());
SessionFactory classicSf = classicCfg.buildSessionFactory();
當(dāng)然最好統(tǒng)一轉(zhuǎn)換成Number然后獲取