`

hibernate 报表查询,实现行变列

阅读更多

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

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

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

 

 

Daoimpl.java代码 复制代码
  1. public Map<String, Object> getSiteHistoryDataPageItems(final List<Variables> sitevars,   
  2.             final Date startdate, final Date enddate, final int start, final int limit) {   
  3.         return (Map<String, Object>) getHibernateTemplate().executeWithNativeSession(new HibernateCallback() {   
  4.             public Object doInHibernate(Session session) throws HibernateException {   
  5.                 // 设置查询条件   
  6.                 DetachedCriteria detachedCriteria = DetachedCriteria.forClass(SiteData.class);   
  7.                 detachedCriteria.add(Restrictions.in("variables", sitevars));   
  8.                    
  9.                 // 行变列   
  10.                 String[] columnAliases = new String[sitevars.size()];// 列别名   
  11.                 Type[] types = new Type[sitevars.size()];//列类型   
  12.                 StringBuilder sqlsb = new StringBuilder();//sql语句   
  13.                                // 遍历所有vars设置列别名   
  14.                 for (int i = 0; i < sitevars.size(); i++) {   
  15.                     columnAliases[i] = "field" + sitevars.get(i).getId();   
  16.                     types[i] = Hibernate.FLOAT;   
  17.                     sqlsb.append("sum(case variables_id when ");   
  18.                     sqlsb.append(sitevars.get(i).getId());   
  19.                     sqlsb.append(" then data_value end) as field");   
  20.                     sqlsb.append(sitevars.get(i).getId());   
  21.                     if (i != sitevars.size() - 1)    
  22.                         sqlsb.append(", ");   
  23.                 }   
  24.                 detachedCriteria.setProjection(Projections.projectionList().add(Projections.property("dataTime").as("data_time")).add(Projections.sqlGroupProjection(sqlsb.toString(), "data_time", columnAliases, types)));   
  25.                                // 这一行很重要主要用于对返回结果集的使用              
  26.                 detachedCriteria.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);   
  27.                    
  28.                 detachedCriteria.add(Restrictions.between("dataTime", startdate, enddate));   
  29.                 detachedCriteria.addOrder(Order.desc("dataTime"));   
  30.                    
  31.                 Criteria executableCriteria = detachedCriteria.getExecutableCriteria(session);   
  32.                 // Get the orginal orderEntries   
  33.                 OrderEntry[] orderEntries = HibernateUtils.getOrders(executableCriteria);   
  34.                 // Remove the orders   
  35.                 executableCriteria = HibernateUtils.removeOrders(executableCriteria);   
  36.                 // get the original projection   
  37.                 Projection projection = HibernateUtils.getProjection(executableCriteria);   
  38.                    
  39.                                // 由于要使用分页,这里返回行变列以后的记录总数   
  40.                 int totalCount = ((Integer) executableCriteria.setProjection(Projections.countDistinct("dataTime")).uniqueResult())   
  41.                 .intValue();   
  42.                    
  43.                 executableCriteria.setProjection(projection);   
  44.                                // 需要再次设置一下结果转换器   
  45.                 executableCriteria.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);   
  46.                 // Add the orginal orderEntries   
  47.                 executableCriteria = HibernateUtils.addOrders(executableCriteria, orderEntries);   
  48.                    
  49.                 List<Map> rows = new ArrayList<Map>();   
  50.                    
  51.                 // 处理结果集   
  52.                 List result = HibernateUtils.getPageResult(executableCriteria, start, limit);   
  53.                 for (Object aResult : result) {   
  54.                     Map<String, Object> row = new HashMap<String, Object>();   
  55.                        
  56.                     Map map = (Map) aResult;   
  57.                        
  58.                     // 时间列   
  59.                     Date date = (Date) map.get("data_time");   
  60.                     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");   
  61.                     row.put("date", sdf.format(date));   
  62.   
  63.                     // 变量列   
  64.                     for (Variables v : sitevars) {    
  65.                         Float f = (Float) map.get("field" + v.getId());   
  66.                         row.put("field" + v.getId(), f);   
  67.                     }   
  68.                     rows.add(row);   
  69.                 }   
  70.                    
  71.                 Map<String, Object> map = new HashMap<String, Object>();   
  72.                 map.put("totalCount", totalCount);   
  73.                 map.put("rows", rows);   
  74.                    
  75.                 return map;   
  76.             }   
  77.         });   
  78.     }  
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics