`

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.     }  
分享到:
评论

相关推荐

    java行转列的例子

    "java行转列"这个主题是数据处理中的一个常见需求,尤其是在数据分析、报表生成或数据显示时。当我们从数据库中获取数据,有时会遇到单个字段的数据需要在用户界面上以列的形式展示,这时就需要进行数据的行列转换。...

    IReport+spring+hibernate

    这个项目利用了IReport来设计和生成各种类型的报表,同时结合了Spring框架进行业务逻辑管理,以及Hibernate作为数据访问层的工具,实现了与MySQL数据库的交互。 IReport是JasperReports库的一部分,主要用于创建...

    Hibernate实战(第2版 中文高清版)

     14.3 联结、报表查询和子查询   14.3.1 联结关系和关联   14.3.2 报表查询   14.3.3 利用子查询   14.4 小结   第15章 高级查询选项   15.1 利用条件和示例查询   15.1.1 基本的条件查询   15.1.2...

    iReport-JasperReport 报表开发指南

    交叉表是一种特殊的报表布局,用于展示行和列之间的数据关联。iReport 提供了一个向导来帮助创建交叉表。 ##### 15.2 行、列和单元格 交叉表由行、列和单元格组成。每一行和每一列都可以有一个或多个层次,每个...

    iReport开发报表详细设计说明书

    其中,Background用于设置报表的背景,Title和Summary分别处理报表的开头和结尾,PageHeader和PageFooter相当于页眉和页脚,ColumnHeader定义列标题,而Detail区域用于放置动态数据,是报表的关键部分,可实现数据的...

    iReport-JasperReports报表开发指南

    HQL(Hibernate Query Language)是一种面向对象的查询语言,可以与Hibernate框架结合使用,以更简便的方式访问数据库。 ##### 10.7 How to implement a new JRDataSource 用户可以实现自己的`JRDataSource`来满足...

    基于java的JasperReports 报表类库v3.5.zip

    数据绑定是将报表字段与数据源中的列进行映射的过程。 4. **报表渲染** - **PDF、HTML、Excel等导出**: JasperReports可以将报表导出为多种格式,满足不同场景的需求。 - **动态交互**: 支持JavaScript和Ajax技术...

    仿照jpa/Hibernate通过反射导入Excel

    在本场景中,“仿照jpa/Hibernate通过反射导入Excel”指的是利用反射机制来实现类似JPA或Hibernate的数据导入功能,将Excel文件中的数据转换为Java对象并存储到数据库中。 首先,我们需要理解JPA和Hibernate。JPA是...

    JasperReports+for+Java+Developers中文版

    在报表设计的过程中,开发者通常需要设置报表的页眉、页脚、列、行、文本字段以及图表等多种元素。JasperReports还支持子报表的使用,使得复杂报表的设计变得更加灵活和高效。子报表是一种包含在主报表中且可复用的...

    PDF套打报表

    这可能涉及到SQL查询、ORM框架(如Hibernate或MyBatis)来与数据库交互,以及对数据进行过滤、排序、分组等操作。 5. **PDF生成与下载**:完成数据绑定后,需要生成最终的PDF文件。这可以通过调用PDF库的相应方法来...

    Itext5生成PDF报表

    在IT行业中,生成PDF报表是一项常见的任务,尤其在数据分析、报告生成或自动化流程中。`iText5`是一个强大的Java库,专门用于创建和编辑PDF文档。本篇将深入探讨如何利用`iText5`生成PDF报表,并结合FastDFS文件系统...

    jxl报表制作工具

    3. **样式设置**: JXL允许开发者定义单元格、行、列甚至是整个工作表的样式,包括边框、背景色、字体颜色、对齐方式等。这样可以创建出具有专业外观的报表。 4. **数据处理与格式化**: 在处理大量数据时,JXL提供...

    java实现excel导入导出

    在Java编程环境中,实现Excel的导入与导出是一项常见的任务,尤其在数据处理、报表生成以及数据交换等场景中。本篇文章将详细讲解如何利用Java技术来实现这一功能,主要涉及的技术栈包括Java本身,以及两个重要的库...

    iReport中文教程(目前最全的)

    #### 16.2 列,行,单元格(Columns, rows, cells) 交叉表由行列交叉形成,每个单元格显示相应的数据。 ### 十七、其他内容 #### 1 常规问题解决方案 提供了一些常用问题的解决方案,例如打印百分比、计算组的发生数...

    基于J2EE的财务管理系统设计与实现.doc

    随着信息技术的飞速发展,计算机技术在现代社会中的应用日益广泛,尤其在财务管理领域,通过采用先进的网络技术和数据库技术,可以极大地提高工作效率,减少人力成本,使得个人和家庭的财务管理变得更加便捷。...

    struts 2Bhibernate实现的教务选课信息管理系统.rar

    总的来说,"struts 2Bhibernate实现的教务选课信息管理系统" 是一个典型的 Java Web 应用,它利用 Struts 2 的 MVC 设计模式来处理用户交互,通过 Hibernate 实现与数据库的高效交互,以构建稳定、高效的教务管理...

    通过groovy自定义函数实现提取明细表字段至主表字段.rar

    2. **数据访问**:Groovy可以方便地与数据库进行交互,通过JDBC API或者ORM框架(如Hibernate)来查询明细表和主表。这里可能涉及到SQL查询语句的编写,以及结果集的处理。 3. **字段映射**:为了将明细表中的字段...

    web项目和iReport文档

    【web项目和iReport文档】知识点详解 IReport是一款强大的报表设计工具,常与Hibernate、Struts等技术结合,用于...在实际开发中,结合Hibernate和Struts,可以实现动态数据的检索和展示,进一步提升报表的实用性。

Global site tag (gtag.js) - Google Analytics