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 orderEntries
- OrderEntry[] orderEntries = HibernateUtils.getOrders(executableCriteria);
- // Remove the orders
- executableCriteria = HibernateUtils.removeOrders(executableCriteria);
- // get the original projection
- Projection 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 orderEntries
- executableCriteria = 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;
- }
- });
- }
分享到:
相关推荐
"java行转列"这个主题是数据处理中的一个常见需求,尤其是在数据分析、报表生成或数据显示时。当我们从数据库中获取数据,有时会遇到单个字段的数据需要在用户界面上以列的形式展示,这时就需要进行数据的行列转换。...
这个项目利用了IReport来设计和生成各种类型的报表,同时结合了Spring框架进行业务逻辑管理,以及Hibernate作为数据访问层的工具,实现了与MySQL数据库的交互。 IReport是JasperReports库的一部分,主要用于创建...
14.3 联结、报表查询和子查询 14.3.1 联结关系和关联 14.3.2 报表查询 14.3.3 利用子查询 14.4 小结 第15章 高级查询选项 15.1 利用条件和示例查询 15.1.1 基本的条件查询 15.1.2...
交叉表是一种特殊的报表布局,用于展示行和列之间的数据关联。iReport 提供了一个向导来帮助创建交叉表。 ##### 15.2 行、列和单元格 交叉表由行、列和单元格组成。每一行和每一列都可以有一个或多个层次,每个...
其中,Background用于设置报表的背景,Title和Summary分别处理报表的开头和结尾,PageHeader和PageFooter相当于页眉和页脚,ColumnHeader定义列标题,而Detail区域用于放置动态数据,是报表的关键部分,可实现数据的...
HQL(Hibernate Query Language)是一种面向对象的查询语言,可以与Hibernate框架结合使用,以更简便的方式访问数据库。 ##### 10.7 How to implement a new JRDataSource 用户可以实现自己的`JRDataSource`来满足...
数据绑定是将报表字段与数据源中的列进行映射的过程。 4. **报表渲染** - **PDF、HTML、Excel等导出**: JasperReports可以将报表导出为多种格式,满足不同场景的需求。 - **动态交互**: 支持JavaScript和Ajax技术...
在本场景中,“仿照jpa/Hibernate通过反射导入Excel”指的是利用反射机制来实现类似JPA或Hibernate的数据导入功能,将Excel文件中的数据转换为Java对象并存储到数据库中。 首先,我们需要理解JPA和Hibernate。JPA是...
在报表设计的过程中,开发者通常需要设置报表的页眉、页脚、列、行、文本字段以及图表等多种元素。JasperReports还支持子报表的使用,使得复杂报表的设计变得更加灵活和高效。子报表是一种包含在主报表中且可复用的...
这可能涉及到SQL查询、ORM框架(如Hibernate或MyBatis)来与数据库交互,以及对数据进行过滤、排序、分组等操作。 5. **PDF生成与下载**:完成数据绑定后,需要生成最终的PDF文件。这可以通过调用PDF库的相应方法来...
在IT行业中,生成PDF报表是一项常见的任务,尤其在数据分析、报告生成或自动化流程中。`iText5`是一个强大的Java库,专门用于创建和编辑PDF文档。本篇将深入探讨如何利用`iText5`生成PDF报表,并结合FastDFS文件系统...
3. **样式设置**: JXL允许开发者定义单元格、行、列甚至是整个工作表的样式,包括边框、背景色、字体颜色、对齐方式等。这样可以创建出具有专业外观的报表。 4. **数据处理与格式化**: 在处理大量数据时,JXL提供...
在Java编程环境中,实现Excel的导入与导出是一项常见的任务,尤其在数据处理、报表生成以及数据交换等场景中。本篇文章将详细讲解如何利用Java技术来实现这一功能,主要涉及的技术栈包括Java本身,以及两个重要的库...
#### 16.2 列,行,单元格(Columns, rows, cells) 交叉表由行列交叉形成,每个单元格显示相应的数据。 ### 十七、其他内容 #### 1 常规问题解决方案 提供了一些常用问题的解决方案,例如打印百分比、计算组的发生数...
随着信息技术的飞速发展,计算机技术在现代社会中的应用日益广泛,尤其在财务管理领域,通过采用先进的网络技术和数据库技术,可以极大地提高工作效率,减少人力成本,使得个人和家庭的财务管理变得更加便捷。...
总的来说,"struts 2Bhibernate实现的教务选课信息管理系统" 是一个典型的 Java Web 应用,它利用 Struts 2 的 MVC 设计模式来处理用户交互,通过 Hibernate 实现与数据库的高效交互,以构建稳定、高效的教务管理...
2. **数据访问**:Groovy可以方便地与数据库进行交互,通过JDBC API或者ORM框架(如Hibernate)来查询明细表和主表。这里可能涉及到SQL查询语句的编写,以及结果集的处理。 3. **字段映射**:为了将明细表中的字段...
【web项目和iReport文档】知识点详解 IReport是一款强大的报表设计工具,常与Hibernate、Struts等技术结合,用于...在实际开发中,结合Hibernate和Struts,可以实现动态数据的检索和展示,进一步提升报表的实用性。