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;
- }
- });
- }
分享到:
相关推荐
论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts...
hibernate实现动态SQL查询,通过XML配置SQL,FREEMARKER 解析,生成要执行的SQL
Hibernate 实现原理 模拟,通过模拟hibernate的实现原理来加深对hibernate实现原理的理解和使用。
实际开发中碰到一个使用hibernate递归查询的问题。我解决了发出来给大家一起分享
Hibernate的查询方式Hibernate的查询方式
Hibernate分页查询小结
ireport,jsperreport,报表,hibernate和Jsperreport整合
hibernate方法实现
hibernate 分页查询的实现 hibernate 内置的有分页功能 有三个参数 thisnumber一个是当前页数 sumcount是一页显示多少条数据 sql是用来查询的sql语句 public List getPageList(int thisNumber, int sumCount, ...
STRUTS2+HIBERNATE分页 实现代码详细的分页实现代码实现代码详细的分页实现代码实现代码详细的分页实现代码实现代码详细的分页实现代码
Hibernate连表查询 Hibernate连表查询
已经建立好了数据库对应的实体类,打开之后直接在项目中练习查询就行。Hibernate和JPA方式都有了。 项目需求: 1. jdk8(因为用到了lambda表达式)。 2. Eclipse或者IDEA开发环境,推荐IDEA,因为我就是用IDEA做的...
7:Hibernate查询缓存Query Cache及实现
hibernate struts2 MyEclipse一个实现查询的小例子,很好用,值得初学者学习一下
ExtJs4.2+Mysql+Struts2+Hibernate3实现分页查询 1.libs目录缺少hibernate核心jar包 2.libs目录缺少struts jar 3.WebRoot目录缺少ExtJs4.2核心类库 以上信息我都在项目里面注明了,因为这些内容的文件太大了,CSDN不...
网络硬盘(Struts 2+Hibernate+Spring实现)网络硬盘(Struts 2+Hibernate+Spring实现)网络硬盘(Struts 2+Hibernate+Spring实现)网络硬盘(Struts 2+Hibernate+Spring实现)网络硬盘(Struts 2+Hibernate+Spring...
使用hibernate实现的分页效果 orm 映射 session 等技能点 带有注释和案例演示 表生成语句
struts2+hibernate+mysql实现简单的注册和登录,适合新手
Spring+Hibernate实现用户登录程序,可执行,里面配置文件是正确的,在mysql中见一个wangwei数据库,再建个user表就可执行
hibernate查询之HQLhibernate查询之HQLhibernate查询之HQL