String xslquery = request.getParameter("xslquery");
String queryhql = "";

if (xslquery != null && !xslquery.equals("")) {
queryhql = (String)session.getAttribute(xslquery);
if(queryhql==null){
return null;   //如果没哟找到hql语句,则失败
}
}

Session sessionHib = sessionFactory.openSession(); 
List<Object> result =  (List<Object>)sessionHib.createQuery(queryhql).list();

代码说明:这段代码是一个servlet(用于Ajax方式把列表内容导入Excel)。因为 查询的列表需要一个hql语句。我把hql语句保存到了Session.setAttribute("usersHql",usersHql);。  点导出Excel按钮时。通过Ajax我会把usersHql发送到servlet。然后就通过session.getAttribute("usersHql")得到了这条hql语句。那么现在我想通过hibernate查询到结果,然后通过jxl写到Excel中。但是问题在于,我这是个通用的处理代码。得到的结果集是List<Object>。 那怎样遍历每个字段呢??
我想把具体的类,例如:com.test.User 作为参数通过ajax传过来。然后强转,通过反射得到User的每个字段。思路是这样,但是不知道怎样强转啊??比如遍历:result
for (Iterator iterator = result.iterator(); iterator.hasNext();) {
    Object obj = (Object) iterator.next();
    //!!!!!!!!  这里把obj 强转为 com.test.User。  但是这个com.test.User知识个字符串啊???
    //接下来通过反射调用所有的get方法(返回值要是String)
}高手求解。

解决方案 »

  1.   

    点击"导出Excel"时Ajax发送语句:writeExl.do?xslquery='userHql'&class='com.test.User'
      

  2.   

    List<Object> result =  (List<Object>)sessionHib.createQuery(queryhql).list();
    把 list 方法重写下吧
    返回  List<T>  就满足你的要求了吧
      

  3.   

    每个pojo写个解析器,根据url传参获得当前查询的pojo,后台判断后就用对应的pojo解析器来强转、get。
      

  4.   

    可以试下这种变通的方法。for (Iterator iterator = result.iterator(); iterator.hasNext();) { 
        Object obj = (Object) iterator.next();    Class cls = obj.getClass();
        Field[] fields = cls.getFields();    //fields已经得到了CLASS的的每个字段了,然后通过反射来取得相应的值就可以了。
    }
      

  5.   

    好是好,但是obj.getClass()得到的cls应该就是Object吧,会是com.test.User吗?(我还是去验证下...)
      

  6.   

    public class TestGetClass {
       public static void main(String[] args) {
       String aa = new String("aaa");
       Object bb = (Object)aa;
       System.out.println(bb.getClass());
       }
    }结果:class java.lang.String恩,行啊!
      

  7.   

    93分,唉,我也不想给 soulx 那么多啊!
      

  8.   

    成功了,很复杂啊。用了很多反射!
    package com.pal.util;import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.lang.reflect.Method;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;import jxl.Workbook;
    import jxl.write.Label;
    import jxl.write.WritableSheet;
    import jxl.write.WritableWorkbook;import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.context.support.ClassPathXmlApplicationContext;import com.fendou.platform.struts.util.BaseAction;/**
     * 此类需要"严格的"遵循特定的规则才能生效。
     * 例如:对于用户列列表的导出:
     * 1.需要在 UserListAction 中 把查询hql 语句  session.setAttribute("userListHql",userListHql);
     * 2.此类用于Ajax,jsp页面需要通过Ajax传递 xslquery="userListHql"
     * 3.通过session.getAttribute("userListHql")得到hql语句;通过Hibernate 得到对应的 Object集合(其实是PO,User集合)。
     * 4.遍历Object集合,通过.getClass得到它是:com.fendou.authority.dao.po.User;
     * 5.通过处理字符串构造字符串:com.fendou.autority.service.impl.UserHelper。
     * 6.截取userHelper,通过Spring的BeanFactory.getBean()来new UserHelper对象。
     * 7.通过反射得到 UserHelper中方法名含有 PoToVo的方法,就得到了userPoToVo()。
     * 8.执行userPoToVo得到UserVo对象。
     * 9.通过反射去得到 UserVo 的 formatExcel(),和formatTitle()方法。得到Map和List
     * 10.通过JXL构造Excel的cell。
     * @author PALGERRARD
     *
     */
    public class ExpExcelAjax extends BaseAction { //静态的,只读取一次
    private static BeanFactory bf = new ClassPathXmlApplicationContext(
    "classpath*:application/*/applicationContext-*.xml"); @SuppressWarnings("unchecked")
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException { Configuration cfg = new Configuration().configure();
    SessionFactory sessionFactory = cfg.buildSessionFactory(); response.setContentType("text/xml;charset=GBK");
    response.setHeader("Cache-Control", "no-cache");
    PrintWriter out = response.getWriter(); HttpSession session = request.getSession(); String xslquery = request.getParameter("xslquery");
    String excelFilename =  request.getParameter("excelFilename");
    // 回调XML
    StringBuffer xml = new StringBuffer();
    xml.append("<?xml version=\"1.0\" encoding=\"GBK\"?>");
    xml.append("<response>");
    try { String queryhql = ""; if (xslquery != null && !xslquery.equals("")) {
    queryhql = (String) session.getAttribute(xslquery);
    if (queryhql == null) {
    return null; // 如果没哟找到hql语句,则失败
    }
    } Session sessionHib = sessionFactory.openSession();
    List<Object> result = (List<Object>) sessionHib.createQuery(
    queryhql).list(); int posX = 0; // 定义在Excel中的单元格 列 坐标
    int posY = 0; // 定义在Excel中的单元格 行 坐标
    File folder = new File("d:\\Excel");
    if (!folder.exists()) {
    folder.mkdirs();
    }
    File xlsExp = new File("d:\\Excel\\"+excelFilename+".xls"); // 定义输出文件
    if (!xlsExp.exists()) {
    xlsExp.createNewFile();
    } OutputStream os = new FileOutputStream(xlsExp);// 输出的Excel文件URL
    WritableWorkbook wwb = Workbook.createWorkbook(os);// 创建可写工作薄
    WritableSheet ws = wwb.createSheet("sheet1", 0);// 创建可写工作表
    posY = 1;
    int fposY = 0;  //第一行标题列 行
    int fposX = 0;  //第一行标题列 列
    boolean isFirst = true; // 判断是否写Excel第一行
    for (Iterator iterator = result.iterator(); iterator.hasNext();) {
    posX = 0; // 列,每行开始置零
    Object obj = (Object) iterator.next();
    Class objCls = obj.getClass();
    String helperName = objCls.getName() + "Helper"; helperName = helperName.replaceAll("dao.po", "service.impl"); // 拼凑对应的Helper类名 Class helperCls = Class.forName(helperName);
    helperName = objCls.getName().toLowerCase() + "Helper";
    String beanName = helperName.substring(helperName
    .lastIndexOf(".") + 1); Object helperObj = bf.getBean(beanName); // 得到bean
    Method[] fs = helperCls.getDeclaredMethods(); for (int i = 0; i < fs.length; i++) { if (fs[i].getName().indexOf("PoToVo") != -1) {
    Object excelVO = null;
    try {
    excelVO = fs[i].invoke(helperObj,
    new Object[] { obj });
    } catch (Exception e) {
    // TODO: handle exception
    e.printStackTrace();
    }
    System.out.println(excelVO.getClass().getName());
    Method formatExceVOMethod = excelVO.getClass()
    .getDeclaredMethod("formatExcel");
    Method formatTitleMethod =  excelVO.getClass()
    .getDeclaredMethod("fromatTitle");
    Map<String,Object> excelMap= (Map<String, Object>)formatExceVOMethod.invoke(excelVO);
    List<String> title = (List<String>)formatTitleMethod.invoke(excelVO) ;  //得到标题行
    for (Iterator tit = title.iterator(); tit
    .hasNext();) {
    String firtLine = (String) tit.next();
    if (isFirst) { Label temp = new Label(fposX, fposY, firtLine);// 创建写入位置和内容
    ws.addCell(temp);
    fposX += 1;


    Object value = excelMap.get(firtLine);
                        if(null==value){
                         value = new String("");
                        }
    Label temp = new Label(posX, posY,
    value.toString());// 创建写入位置和内容
    posX += 1;
    ws.addCell(temp);
    }
    }
    } isFirst = false; //不是第一行了
    posY += 1; // 行加一 }
    sessionHib.close();
    wwb.write();
    wwb.close();
    os.close(); xml.append("<status>导入Excel成功</status>");
    } catch (Exception e) {
    e.printStackTrace();
    xml.append("<status>导入Excel失败</status>");
    } finally {
    xml.append("</response>");
    out.flush();
    out.print(xml);
    out.close();
    } return null;
    }}