建立的存储过程:
  CREATE PROCEDURE SelOnline
  @UserID  int   as
  select * FROM Online WHERE UserID=@UserID and Isonline=1 and DATEDIFF(s,ActiveTime,getdate())<=20  
===================================================================================================
online.hbm.xml文件:(<class>用反向工程生成的,应该无错,<sql-query>是自己写的,不知道问题在这没有)
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping package="com.xihua.entity">
<class name="Online" table="Online" schema="dbo"
catalog="jinxiaocun">
<id name="onlineId" type="java.lang.Integer">
<column name="OnlineID" />
<generator class="native" />
</id>
<property name="companyId" type="java.lang.Integer">
<column name="CompanyID" />
</property>
<property name="userId" type="java.lang.Integer">
<column name="UserID" />
</property>
<property name="sessionId" type="java.lang.String">
<column name="SessionID" length="100" />
</property>
<property name="userIp" type="java.lang.String">
<column name="UserIP" length="50" />
</property>
<property name="loginTime" type="java.util.Date">
<column name="LoginTime" length="23" />
</property>
<property name="activeTime" type="java.util.Date">
<column name="ActiveTime" length="23" />
</property>
<property name="loginAmount" type="java.lang.Integer">
<column name="LoginAmount" />
</property>
<property name="logtimeAmount" type="java.lang.Integer">
<column name="LogtimeAmount" />
</property>
<property name="logtimeStat" type="java.lang.String">
<column name="LogtimeStat" />
</property>
<property name="isonline" type="java.lang.Integer">
<column name="Isonline" />
</property>
</class>
<sql-query name="getOnline" callable="true">
<return class="com.xihua.entity.Online" />
{call SelOnline(?)}
</sql-query>
</hibernate-mapping>
===================================================================================================
test程序:
public static void main(String[] args) {
ApplicationContext context = new FileSystemXmlApplicationContext(
"/WebRoot/WEB-INF/applicationContext.xml");
                IOnlineDAO onlineDao = (IOnlineDAO) context.getBean("onlineDao");
List<String> params = new ArrayList<String>();
params.add("679");
List<Online> lst = onlineDao.executeStoredProcedure("{call SelOnline(?)}", params); //这个方法下面给出
                System.out.println(lst.size()); //这里打印是1,证明有了数据。
Online o = lst.get(0);  //这里报了异常:        Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.xihua.entity.Online
at com.xihua.test.Test.main(Test.java:41)
}
===================================================================================================
onlineDao类的executeStoredProcedure方法是这样的:
public List executeStoredProcedure(final String hql,final List<String> params) {
return super.getHibernateTemplate().executeFind(
new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
Query q = session.createSQLQuery(hql);
for (int i = 0; i < params.size(); i++) {
q.setString(i, params.get(i));
}
return q.list();
}
});
}
===================================================================================================
数据是查出来了,就是不能转为实体类,各位大侠帮帮小弟吧!

解决方案 »

  1.   

    我搞定了,原来是List <Online> lst = onlineDao.executeStoredProcedure("{call SelOnline(?)}", params)出错的
    应该是写List <Online> lst = onlineDao.executeStoredProcedure("getOnline", params); //这个方法下面给出 
      

  2.   

    需要进行类型装换
    Online o = (Online)lst.get(0);  //这里报了异常: 
      

  3.   

    面向存储过程的一般不用Hibernate吧,这并不是它擅长的地方