最近,使用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返回的就够了。当然万能更好。
求各位达人们帮帮忙。
但是现在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返回的就够了。当然万能更好。
求各位达人们帮帮忙。
我给你写个方法
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;
}
}
楼主应该仔细思考下
我觉得参数为hql应该不可行,绕弯了
的所有属性读出来存入map
如果没有只存对象本身(把基本类型看做对象)
实现起来也不是很难
你觉得呢?
如hql="select new Map(a.name as T_NAME,a as Teacher) from Teacher a";
如此就得到一个List土封装了一个HashMap("T_NAME",值),HashMap("Teacher",对象)的形式装的,现在就比较好写通用方法了