String sql = "from tabfunc";
HibernateDAO dao = new HibernateDAO();
Session session = dao.getSession();
Query query = session.createQuery(sql);
List l = query.list();for (int i = 0; i < l.size(); i++) {
  String[] str = (String[])l.get(i);   //这是100行
  for (int j = 0; j<str.length; j++){
    System.out.println(str[j].toString());
  }
}
运行出错了type Exception reportmessage description The server encountered an internal error () that prevented it from fulfilling this request.exception javax.servlet.ServletException
org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:545)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:486)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
com.lianchuang.unicrm.pub.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:99)
root cause java.lang.ClassCastException
com.lianchuang.unicrm.grade.report.CityIncomeKeepReportLogic.query(CityIncomeKeepReportLogic.java:100)
com.lianchuang.unicrm.grade.report.CityIncomeKeepReportAction.query(CityIncomeKeepReportAction.java:62)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:324)
org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:280)
com.lianchuang.unicrm.struts.BaseAction.execute(BaseAction.java:104)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
com.lianchuang.unicrm.pub.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:99)
note The full stack trace of the root cause is available in the Tomcat logs.

解决方案 »

  1.   

    你的list里至少有一个不是String[]类型
      

  2.   

    java.lang.ClassCastException;类型不匹配String[] str = (String[])l.get(i); //这是100行
    强制转换出了错
      

  3.   

    java.lang.ClassCastException类转型异常
    你先把list中每个对象输出来看看啊
    System.out.println(l.get(i));
    应该有不是String型的
      

  4.   

    是不是没有强转的原因,你把List l = query.list();改为List l =(List)query.list();试试。而且List里存的是数组吗?
      

  5.   

    我查询的结果集List l是一个sql(select * from tab_func)语句执行的结果,这个结果集是个LIST,但是我不知道为什么会转换出错,各位在使用的时候怎么用的?
      

  6.   

    query.list(),返回的list中的数据是一个Map把必须这样
     for(int i=0;i<list.size();i++) {
       Map result = (Map)list.get(i);
       //然后是用个bean来读出数据
     }
      

  7.   

    to tomcatwang1982:
      List.get返回的是一个map,然后呢,怎么返回前台,有例子贴一个吗?谢谢.
     我们是用List.get一个个取出查询的行,然后再拼成新的List返回给前台.
      你有没有更好的方式,我先把我们的代码贴出来.    List l = query.list();
        List lis = new ArrayList();
        BigDecimal sum1 = new BigDecimal(0);
        BigDecimal sum2 = new BigDecimal(0);
        BigDecimal sum3 = new BigDecimal(0);
        BigDecimal sum4 = new BigDecimal(0);
        BigDecimal sum5 = new BigDecimal(0);
        BigDecimal sum6 = new BigDecimal(0);
        BigDecimal sum7 = new BigDecimal(0);
        BigDecimal sum8 = new BigDecimal(0);
        BigDecimal sum9 = new BigDecimal(0);
        BigDecimal sum10 = new BigDecimal(0);
        BigDecimal sum11 = new BigDecimal(0);
        for (int i = 0; i < l.size(); i++) {
          Object[] o = (Object[]) l.get(i);
          Object[] t = new Object[6];
          if (o[0] == null) {
            t[0] = "无级别";
          } else {
            t[0] = o[0] = ParaDesc.getGradeName((String) o[0], dao
                .getSession());
          }//星级名称
          t[1] = o[1];//包保用户数
          t[2] = o[4];//收入
          //System.out.println("o[4]====" + ((BigDecimal) o[4]).longValue());
          if (o[3].equals(new BigDecimal(0))) {
            t[3] = new BigDecimal(0);
          } else {
            t[3] = precentdiv(((Long) o[2]).longValue(), ((Long) o[3])
                .longValue()); //停机率
          }      if (o[6].equals(new BigDecimal(0))) {
            t[4] = new BigDecimal(0);
          } else {
            t[4] = precentdiv(((Long) o[7]).longValue(), ((Long) o[6])
                .longValue()); //通话率
          }
          if (o[5].equals(new BigDecimal(0))) {
            t[5] = new BigDecimal(0);
          } else {
            t[5] = precentdiv(((BigDecimal) o[8]).longValue(),
                ((BigDecimal) o[5]).longValue()); //欠费率
          }
          lis.add(t);
          sum1 = sum1.add(new BigDecimal(o[1].toString()));
          sum2 = sum2.add(new BigDecimal(o[2].toString()));
          sum3 = sum3.add(new BigDecimal(o[3].toString()));
          sum4 = sum4.add((BigDecimal) o[4]);
          sum5 = sum5.add((BigDecimal) o[5]);
          sum6 = sum6.add(new BigDecimal(o[6].toString()));
          sum7 = sum7.add(new BigDecimal(o[7].toString()));
          sum8 = sum8.add((BigDecimal) o[8]);
          sum9 = sum9.add(new BigDecimal(o[9].toString()));
          sum10 = sum10.add(new BigDecimal(o[10].toString()));
          sum11 = sum11.add(new BigDecimal(o[11].toString()));
        }
        //汇总
        Object[] obj = new Object[6];
        obj[0] = "汇总";
        obj[1] = sum1;
        obj[2] = sum5;
        if (sum2.equals(new BigDecimal(0))) {
          obj[3] = new BigDecimal(0);
        } else {
          obj[3] = precentdiv(new Long(sum2.toString()).longValue(),
              new Long(sum3.toString()).longValue()); //停机率
        }    if (new BigDecimal(sum6.toString()).equals(new BigDecimal(0))) {
          obj[4] = new BigDecimal(0);
        } else {
          obj[4] = precentdiv(new Long(sum7.toString()).longValue(),
              new Long(sum6.toString()).longValue()); //通话率
        }    if (sum5.equals(new BigDecimal(0))) {
          obj[5] = new BigDecimal(0);
        } else {
          obj[5] = precentdiv(((BigDecimal) sum8).longValue(),
              ((BigDecimal) sum5).longValue()); //欠费率
        }    lis.add(obj);
        String[] fields = new String[] { "星级", "用户数", "收入", "停机率", "通话率", "欠费率" };
        return new Object[] { lis, fields };
      

  8.   

    解决了,但是解决的莫名其妙.
    各位不知道是不是碰到类似的情况.
    Hibernate的hql如果写成
    sql = "from TabFunc";
      则直接将 HibernateDAO dao = new HibernateDAO();
    Session session = dao.getSession();

    String sql = createSql(form);

    Query query = session.createQuery(sql);
    List lis = query.list();
    中的lis返回给前台,则出错将hql换个写法,其他一点也不变,就好使了 (晕,为什么???)
    sql = "select a.funcid,a.funcname,a.workurl from TabFunc a";
    再将lis反给前台,前台可以正常显示了