首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 企业软件 > 行业软件 >

hibernate 表格查询,实现行变列

2012-11-03 
hibernate 报表查询,实现行变列http://5211422.iteye.com/blog/322542这篇文章中介绍了sql语句实现的行变

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   对性能的影响是不是很大啊

热点排行