hibernate 多表查询

最近在项目中使用了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的事务管理。

你可能感兴趣的:(hibernate 多表查询)