hibernate 多表查询

来源:互联网 发布:c语言 new 编辑:程序博客网 时间:2024/05/19 20:38

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

原创粉丝点击