hibernate分组与聚合查询(原生sql和使用case when then else end的hql)

需求:根据某些字段进行分组查询,并使用聚合函数sum()有条件的进行统计

 

一、用hibernate使用原生sql进行查询

 

// 服务器调配情况统计查询类 IdcStatisticSpec public class IdcStatisticSpec extends AbstQueryStringSpec { /** 机房ID */ private Integer compLocaId; /** 查询的开始时间 */ private Date beginDate; /** 查询的结束时间 */ private Date endDate; // 省略get set public String queryString() { StringBuffer sql = new StringBuffer( "SELECT app.MRL,app.OPERATION_ID,app.PRODUCT_ID," + "sum(if(cab.type='ONSHOW',1,0)) as onshowNumber, " + "sum(if(cab.type='WITHDRAW',1,0)) as withdrawNumber, " + "sum(if(cab.type='MOVE',1,0)) as moveNumber, " + "sum(if(cab.type='WITHDRAW' and cab.reversion='RETURN',1,0)) as returnNumber " + "FROM chanage_apply app,chanage_cabinets cab,chanage_cabinets_execute exe " + "WHERE app.id=cab.APPLICATION_ID AND app.id=exe.APPLICATION_ID " + "AND app.MRL is not null AND app.MRL!=0 " + "AND app.OPERATION_ID is not null AND app.OPERATION_ID!=0 " + "AND app.PRODUCT_ID is not null AND app.PRODUCT_ID!=0 " + "AND exe.attitude='Y' "); if (QuerySpecUtil.valid(compLocaId)) { sql.append("AND app.MRL=:compLocaId "); } if (QuerySpecUtil.valid(beginDate)) { sql.append("AND exe.EXECUTE_TIME>=:beginDate "); } if (QuerySpecUtil.valid(endDate)) { sql.append("AND exe.EXECUTE_TIME<=:endDate "); } sql.append("GROUP BY app.mrl,app.OPERATION_ID,app.PRODUCT_ID "); return sql.toString(); } @Override protected void reset() { compLocaId = null; beginDate = null; endDate = null; } }

 

 

// 后台service类 public class IdcStatisticImpl extends EossBaseService implements IIdcStatistic { public List findIdcStatistic(IdcStatisticSpec spec) { Session session = baseDAO.getSessionFactory().getCurrentSession(); List sqlList = new ArrayList(); SQLQuery sqlQuery = session.createSQLQuery(spec.queryString()); if (spec.getCompLocaId() != null) { sqlQuery = (SQLQuery) sqlQuery.setParameter("compLocaId", spec.getCompLocaId()); } if (spec.getBeginDate() != null) { sqlQuery = (SQLQuery) sqlQuery.setParameter("beginDate", spec.getBeginDate()); } if (spec.getEndDate() != null) { sqlQuery = (SQLQuery) sqlQuery.setParameter("endDate", spec.getEndDate()); } // 查询数据 sqlList = sqlQuery.list(); List idcList = new ArrayList(); if (sqlList != null && !sqlList .isEmpty()) { for (Object obj : hqlList) { Object[] objs = (Object[]) obj; // 机房 Integer mrl = Integer.valueOf(objs[0].toString()); String compLocaName = baseDAO.findById(ComputerLocation.class, mrl).getName(); // 所属业务 Integer operationId = Integer.valueOf(objs[1].toString()); String operationName = baseDAO.findById(Operation.class, operationId).getOperationName(); // 项目名称 Integer productId = Integer.valueOf(objs[2].toString()); String productName = baseDAO.findById(Product.class, productId) .getPrudName(); Integer onshowNumber = Integer.valueOf(objs[3].toString()); Integer withdrawNumber = Integer.valueOf(objs[4].toString()); Integer moveNumber = Integer.valueOf(objs[5].toString()); Integer returnNumber = Integer.valueOf(objs[6].toString()); IdcStatisticBO idcBO = new IdcStatisticBO(); idcBO.setCompLocaId(mrl); idcBO.setOperationId(operationId); idcBO.setProductId(productId); idcBO.setCompLocaName(compLocaName); idcBO.setOperationName(operationName); idcBO.setProductName(productName); idcBO.setOnshowNumber(onshowNumber); idcBO.setWithdrawNumber(withdrawNumber); idcBO.setMoveNumber(moveNumber); idcBO.setReturnNumber(returnNumber); idcBO.setTotalOnshowNumber(onshowNumber); idcBO.setTotalWithdrawNumber(withdrawNumber); idcBO.setTotalMoveNumber(moveNumber); idcBO.setTotalReturnNumber(returnNumber); idcList.add(idcBO); } } // 计算每个机房上架、下架、迁移、归还数 Map map = new HashMap(); for (int i = 0; i < idcList.size(); i++) { IdcStatisticBO idc = idcList.get(i); if (map.containsKey(idc.getCompLocaName())) { IdcStatisticBO mapValue = map.get(idc.getCompLocaName()); idc.setTotalOnshowNumber(idc.getOnshowNumber() + mapValue.getTotalOnshowNumber()); idc.setTotalWithdrawNumber(idc.getWithdrawNumber() + mapValue.getTotalWithdrawNumber()); idc.setTotalMoveNumber(idc.getMoveNumber() + mapValue.getTotalMoveNumber()); idc.setTotalReturnNumber(idc.getReturnNumber() + mapValue.getTotalReturnNumber()); map.put(idc.getCompLocaName(), idc); } else { map.put(idc.getCompLocaName(), idc); } } for (int i = 0; i < idcList.size(); i++) { IdcStatisticBO idc = idcList.get(i); for (Iterator it = map.keySet().iterator(); it.hasNext();) { if (idc.getCompLocaName().equals(it.next())) { IdcStatisticBO mapvalue = map.get(idc.getCompLocaName()); idc.setTotalOnshowNumber(mapvalue.getTotalOnshowNumber()); idc.setTotalWithdrawNumber(mapvalue .getTotalWithdrawNumber()); idc.setTotalMoveNumber(mapvalue.getTotalMoveNumber()); idc.setTotalReturnNumber(mapvalue.getTotalReturnNumber()); } } } return idcList; } }

 

 

 

 

二、hibernate hql查询,使用case when then else end

 

public class IdcStatisticSpec extends AbstQueryStringSpec { /** 机房ID */ private Integer compLocaId; /** 查询的开始时间 */ private Date beginDate; /** 查询的结束时间 */ private Date endDate; @Override public String queryString() { StringBuffer hql = new StringBuffer( "SELECT app.mrl,app.operationId,app.productId," + "sum(case when cab.type='ONSHOW' then 1 else 0 end) as onshowNumber, " + "sum(case when cab.type='WITHDRAW' then 1 else 0 end) as withdrawNumber, " + "sum(case when cab.type='MOVE' then 1 else 0 end) as moveNumber, " + "sum(case when cab.type='WITHDRAW' and cab.reversion='RETURN' then 1 else 0 end) as returnNumber " + "from ChanageApply app,ChanageCabinets cab,ChanageCabinetsExecute exe " + "where app.id=cab.applicationId and app.id=exe.applicationId " + "and app.mrl!=null and app.mrl!=0 " + "and app.operationId!=null and app.operationId!=0 " + "and app.productId!=null and app.productId!=0 " + "and exe.attitude='Y' "); if (QuerySpecUtil.valid(compLocaId)) { hql.append(" AND app.mrl=:compLocaId "); this.setParam("compLocaId", compLocaId); } if (QuerySpecUtil.valid(beginDate)) { hql.append(" AND exe.executeTime>=:beginDate"); this.setParam("beginDate", beginDate); } if (QuerySpecUtil.valid(endDate)) { hql.append(" AND exe.executeTime<=:endDate"); this.setParam("endDate", endDate); } hql.append(" group by app.mrl,app.operationId,app.productId "); return hql.toString(); } // 其它省略 }

 

 

后台service

public class IdcStatisticImpl extends EossBaseService implements IIdcStatistic { public List findIdcStatistic(IdcStatisticSpec spec) { // hql查询 List hqlList = baseDAO.query(spec); List idcList = new ArrayList(); if (hqlList != null && !hqlList.isEmpty()) { for (Object obj : hqlList) { Object[] objs = (Object[]) obj; // 机房 Integer mrl = Integer.valueOf(objs[0].toString()); String compLocaName = baseDAO.findById(ComputerLocation.class, mrl).getName(); // 所属业务 Integer operationId = Integer.valueOf(objs[1].toString()); String operationName = baseDAO.findById(Operation.class, operationId).getOperationName(); // 项目名称 Integer productId = Integer.valueOf(objs[2].toString()); String productName = baseDAO.findById(Product.class, productId) .getPrudName(); Integer onshowNumber = Integer.valueOf(objs[3].toString()); Integer withdrawNumber = Integer.valueOf(objs[4].toString()); Integer moveNumber = Integer.valueOf(objs[5].toString()); Integer returnNumber = Integer.valueOf(objs[6].toString()); IdcStatisticBO idcBO = new IdcStatisticBO(); idcBO.setCompLocaId(mrl); idcBO.setOperationId(operationId); idcBO.setProductId(productId); idcBO.setCompLocaName(compLocaName); idcBO.setOperationName(operationName); idcBO.setProductName(productName); idcBO.setOnshowNumber(onshowNumber); idcBO.setWithdrawNumber(withdrawNumber); idcBO.setMoveNumber(moveNumber); idcBO.setReturnNumber(returnNumber); idcBO.setTotalOnshowNumber(onshowNumber); idcBO.setTotalWithdrawNumber(withdrawNumber); idcBO.setTotalMoveNumber(moveNumber); idcBO.setTotalReturnNumber(returnNumber); idcList.add(idcBO); } } // 计算每个机房上架、下架、迁移、归还数 Map map = new HashMap(); for (int i = 0; i < idcList.size(); i++) { IdcStatisticBO idc = idcList.get(i); if (map.containsKey(idc.getCompLocaName())) { IdcStatisticBO mapValue = map.get(idc.getCompLocaName()); idc.setTotalOnshowNumber(idc.getOnshowNumber() + mapValue.getTotalOnshowNumber()); idc.setTotalWithdrawNumber(idc.getWithdrawNumber() + mapValue.getTotalWithdrawNumber()); idc.setTotalMoveNumber(idc.getMoveNumber() + mapValue.getTotalMoveNumber()); idc.setTotalReturnNumber(idc.getReturnNumber() + mapValue.getTotalReturnNumber()); map.put(idc.getCompLocaName(), idc); } else { map.put(idc.getCompLocaName(), idc); } } for (int i = 0; i < idcList.size(); i++) { IdcStatisticBO idc = idcList.get(i); for (Iterator it = map.keySet().iterator(); it.hasNext();) { if (idc.getCompLocaName().equals(it.next())) { IdcStatisticBO mapvalue = map.get(idc.getCompLocaName()); idc.setTotalOnshowNumber(mapvalue.getTotalOnshowNumber()); idc.setTotalWithdrawNumber(mapvalue .getTotalWithdrawNumber()); idc.setTotalMoveNumber(mapvalue.getTotalMoveNumber()); idc.setTotalReturnNumber(mapvalue.getTotalReturnNumber()); } } } return idcList; } }

 

你可能感兴趣的:(JAVA,hibernate)