最近在项目中使用了hibernate作为ORM框架,很多情况下都需要使用到多表联合查询,使用hibernate时,由于对于多表没有相应的实体类与数据库表相对应,因此不方便直接使用HQL进行查询,通过网上查找,发现hibernate的session可以通过调用createSQLQuery()方法直接执行SQL语句,返回的是SQLQuery,在调用list()方法就可以获取查询出来的数据:
public List getListFromMutiTable(String sql) {
SQLQuery queryUpdate = getHibernateTemplate().getSessionFactory().getCurrentSession().createSQLQuery(sql);
List objectList = queryUpdate.list();
return objectList;
}
它们都将返回一个Object数组(Object[])组成的List,数组每个元素都是所查询表的一个字段值,每一行对应一个Object[]数组。Hibernate会使用ResultSetMetadata来判定返回的标量值的实际顺序和类型:
public List<YiYaEventTipsStats> retrieveActivityStatsInfoList() {
List<YiYaEventTipsStats> eventTipsStatsList = new ArrayList<YiYaEventTipsStats>();
String hql = "select tips.id,tips.title,tips.startTime,tips.endTime,tips.joinCount,u.winCount "
+ "from (select t.id,t.title,t.starttime,t.endtime,count(u.tipid) joinCount from yiya_eventtips t left join yiya_eventtipsuser u on t.id=u.tipid group by t.title,t.id,t.starttime,t.endtime) tips "
+ "left join (select t.tipid,count(t.tipid) winCount from yiya_eventtipsuser t where t.iswin=1 group by t.tipid) u on tips.id=u.tipid";
List list = baseDao.getListFromMutiTable(hql);
int size = list.size();
for(int i=0; i<size; i++) {
YiYaEventTipsStats eventTipsStats = new YiYaEventTipsStats();
BigDecimal id = (BigDecimal )((Object[])list.get(i))[0];
eventTipsStats.setId(id);
String title = (String)((Object[])list.get(i))[1];
eventTipsStats.setTitle(title);
Date startTime = (Date)((Object[])list.get(i))[2];
eventTipsStats.setStartTime(startTime);
Date endTime = (Date)((Object[])list.get(i))[3];
eventTipsStats.setEndTime(endTime);
BigDecimal joinCount = (BigDecimal )((Object[])list.get(i))[4];
eventTipsStats.setJoinCount(joinCount);
BigDecimal winCount = (BigDecimal )((Object[])list.get(i))[5];
eventTipsStats.setWinCount(winCount);
eventTipsStatsList.add(eventTipsStats);
}
System.out.println("size: " + eventTipsStatsList.size());
return eventTipsStatsList;
}
只能通过解析Object[]数组来获取所有的列植,再调用set方法设置到相应的对象中,这样就可以很方便的对多表进行查询,同时使用hibernate的事务管理。