读书人

hibernate 表格查询,实现行变列

发布时间: 2012-11-03 10:57:43 作者: rapoo

hibernate 报表查询,实现行变列

http://5211422.iteye.com/blog/322542

这篇文章中介绍了sql语句实现的行变列.

但是如果使用Hibernate怎么来做呢,今天摸索了一天,终于小有所成,通过Hibernat的投影(Projections)实现了行变列的变态排版,同时还要考虑到分页的支持,做起来还是有点麻烦的.下面是具体代码:

?

?

public Map<String, Object> getSiteHistoryDataPageItems(final List<Variables> sitevars,final Date startdate, final Date enddate, final int start, final int limit) {return (Map<String, Object>) getHibernateTemplate().executeWithNativeSession(new HibernateCallback() {public Object doInHibernate(Session session) throws HibernateException {// 设置查询条件DetachedCriteria detachedCriteria = DetachedCriteria.forClass(SiteData.class);detachedCriteria.add(Restrictions.in("variables", sitevars));// 行变列String[] columnAliases = new String[sitevars.size()];// 列别名Type[] types = new Type[sitevars.size()];//列类型StringBuilder sqlsb = new StringBuilder();//sql语句                               // 遍历所有vars设置列别名for (int i = 0; i < sitevars.size(); i++) {columnAliases[i] = "field" + sitevars.get(i).getId();types[i] = Hibernate.FLOAT;sqlsb.append("sum(case variables_id when ");sqlsb.append(sitevars.get(i).getId());sqlsb.append(" then data_value end) as field");sqlsb.append(sitevars.get(i).getId());if (i != sitevars.size() - 1) sqlsb.append(", ");}detachedCriteria.setProjection(Projections.projectionList().add(Projections.property("dataTime").as("data_time")).add(Projections.sqlGroupProjection(sqlsb.toString(), "data_time", columnAliases, types)));                               // 这一行很重要主要用于对返回结果集的使用detachedCriteria.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);detachedCriteria.add(Restrictions.between("dataTime", startdate, enddate));detachedCriteria.addOrder(Order.desc("dataTime"));Criteria executableCriteria = detachedCriteria.getExecutableCriteria(session);// Get the orginal orderEntriesOrderEntry[] orderEntries = HibernateUtils.getOrders(executableCriteria);// Remove the ordersexecutableCriteria = HibernateUtils.removeOrders(executableCriteria);// get the original projectionProjection projection = HibernateUtils.getProjection(executableCriteria);                               // 由于要使用分页,这里返回行变列以后的记录总数int totalCount = ((Integer) executableCriteria.setProjection(Projections.countDistinct("dataTime")).uniqueResult()).intValue();executableCriteria.setProjection(projection);                               // 需要再次设置一下结果转换器executableCriteria.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);// Add the orginal orderEntriesexecutableCriteria = HibernateUtils.addOrders(executableCriteria, orderEntries);List<Map> rows = new ArrayList<Map>();// 处理结果集List result = HibernateUtils.getPageResult(executableCriteria, start, limit);for (Object aResult : result) {Map<String, Object> row = new HashMap<String, Object>();Map map = (Map) aResult;// 时间列Date date = (Date) map.get("data_time");SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");row.put("date", sdf.format(date));// 变量列for (Variables v : sitevars) { Float f = (Float) map.get("field" + v.getId());row.put("field" + v.getId(), f);}rows.add(row);}Map<String, Object> map = new HashMap<String, Object>();map.put("totalCount", totalCount);map.put("rows", rows);return map;}});}

?

?

?

?

?

?

1 楼 tianju517 2009-06-06 感觉还是很麻烦 2 楼 魔力猫咪 2009-06-07 Hibernate用到这个份上,还不如直接SQL呢。 3 楼 bcw104 2009-06-08 魔力猫咪 写道Hibernate用到这个份上,还不如直接SQL呢。
直接用sql就用不了已经实现好的分页功能了,难道你为了这一点就放弃Hibernate吗?
直接用sql你试试,写的比这个还要多,性能列不敢说能高到哪去. 4 楼 jy02441615 2009-06-09 查询用JDBC 增,删,改这些针对对象的操作用Hibernate? 5 楼 http_url 2009-06-09 用Ibatis不是更好,我做的一个项目有一个很复杂的查询,就是用的Ibatis做的 6 楼 bcw104 2009-06-09 jy02441615 写道查询用JDBC 增,删,改这些针对对象的操作用Hibernate?
那你用Hibernate的时候不用它的增删改吗?
还是只用Hibernate的查询,增删改全用sql?
7 楼 bcw104 2009-06-09 http_url 写道用Ibatis不是更好,我做的一个项目有一个很复杂的查询,就是用的Ibatis做的

当然也可以,实现上通过Hibernate也可以直接用sql,但我不喜欢写那么多字符串,让Hibernate替我去做感觉方便很多,
其实上面的代码也并不复杂. 8 楼 bcw104 2009-06-09 jy02441615 写道查询用JDBC 增,删,改这些针对对象的操作用Hibernate?
可能我误解你的意思了,我想说的是qbc再强大,再灵活也没有hql/sql灵活,不过通过qbc也可以用sql,所以还是说的过去的 9 楼 少女杀手 2009-06-13 看的我俩眼球转圈 10 楼 bcw104 2009-06-15 少女杀手 写道看的我俩眼球转圈
实际上核心的地方就一点点
只是我加了一些我实际应用中业务上的代码,跟代变列是没有关系的 11 楼 xuzhfa123 2009-06-19 那就删除那不相关代码,看得有点晕 12 楼 tczj 2009-06-30 代码的可读性太差.....不管你实得多好...没几个人会看的...LZ你最好整理一下 13 楼 zhiblin 2009-07-01 对性能的影响是不是很大啊

读书人网 >行业软件

热点推荐