最近,使用Hibernate由于需要大量的解析返回的结果集合List,将所需的结果按照一个HashMap<字段名,字段值>的形式,由于结果集有多条,所以需要将这个HashMap再放入一个ArrayList中。如此就可以循环ArrayList再通过字段名从HashMap中取得所需要的值。
  但是现在Hibernate返回的结果集List结构并不固定
  表Student和Teacher两张表,其中Teacher和Student是一对多的关系,Student中一个t_id的字段引用Teacher的主键;
  Teacher 有字段T_ID,T_NAME     Student有字段S_ID,S_NAME,T_ID
  hql="select a from Teacher a";此时List里面仅仅是以List->Object(Teacher)的形式进行封装
  hql="select a.name from Teacher a";此时List里面就封装的是基本类型Object(String)
  hql="select a,b.name from Teacher a,Student b where a.id=b.tId";此时List里面封装的就是一个Object[]{Teacher,String}
   那么我如何通过一个方法去解析这些List让他们以
  HashMap htm=new HashMap();
   ArrayList<Object[]) arr=new ArrayList();
   if(list.size>0){
   for(Object[] obj : list){
   Teacher t=(Teacher)obj[0];
   String sName=(String)obj[1];
   htm.put("T_ID",t.getTId);
   htm.put("T_Name",t.getTName);
   htm.put("S_NAME",sName);
   arr.add(htm);
   }
  }
  这儿我是假设List里面装的是Object数组,而且这个方法也不是通用的,如果是其他的hql语句这个解析方法就不适用了。
  那么我就需要一个通用的方法去解析Hibernate返回的结果集List,注意这儿只需要能够解析Hibernate返回的就够了。当然万能更好。
  求各位达人们帮帮忙。

解决方案 »

  1.   

    楼主,你很幸运,hibernate3提供了这方面的API
    我给你写个方法
    public List getMapWithSQL(String sql){
    Session session = this.getSession();
    try {
    Query query = session.createSQLQuery(sql).setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
    return query.list();
    } catch (HibernateException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    return null;
    }
      

  2.   

    基于你最终得到的结果并不是对象,我觉得没有必要再写hql,我这个方法当然只支持sql语句的
    楼主应该仔细思考下
    我觉得参数为hql应该不可行,绕弯了
      

  3.   

    这个不错.!  如果非要用hql的话,我再去查查文档看有没有比较好的解决方案
      

  4.   

      因为是必须得使用HQL的,要是用SQL早就可以用ResultSetMetaDate去解决了,那个可以做到通用,因为他是有存储过程的。
      

  5.   

      三楼,如果我返回的List里面封装了一个Object[]{String,Teacher,Student}我觉得是有可能的,因为有好多需求是不仅仅只有某个对象,还有其他对象的某个属性也需要返回
      

  6.   

    推荐用java反射机制,如果对象有get方法就把有get方法
    的所有属性读出来存入map
    如果没有只存对象本身(把基本类型看做对象)
    实现起来也不是很难
    你觉得呢?
      

  7.   

      刚得到一种方案,在HQL中直接先进行一遍封装
      如hql="select new Map(a.name as T_NAME,a as Teacher) from Teacher a";
      如此就得到一个List土封装了一个HashMap("T_NAME",值),HashMap("Teacher",对象)的形式装的,现在就比较好写通用方法了
      

  8.   

    hibernate 查询数据库后返回的list的数据结构是什么?