使用hibernate的query查詢時覆蓋值的問題

舟之橋發表於2013-01-30
int maxYear = this.getMaxYear();
		int minYear = this.getMinYear();
		
		StringBuffer hql = new StringBuffer(1024);
		hql.append(" SELECT a.reason ");
		for(int i = minYear; i <= maxYear; i++){
			//hql.append(" , Max(CASE a.year WHEN '" + i + "' THEN a.num ELSE 0 END) as m" + (i - minYear + 1) + " ");
			hql.append(" , Max(CASE a.year WHEN '" + i + "' THEN a.num ELSE 0 END) as m ");
	    }
		hql.append(" FROM  ");
		hql.append(" (SELECT d.reasonId AS reason ");
	    hql.append(" ,YEAR(c.occurDate) AS year ");
	    hql.append(" ,COUNT(c.id) AS num ");
	    hql.append(" FROM   IMPS_RP_ASSET_DAMAGE c, IMPS_RP_ASSET_DAMAGE_MAP d ");
	    hql.append(" where  c.id = d.assetDamageId ");
	    if(!StrTool.isBlankStr(lineQueryCondition.getDirectionId())){
			hql.append(" and c.directionId = :directionId ");
		}
		if(lineQueryCondition.getReasonList() != null){
			hql.append(" and d.reasonId in (:reasons) ");
		}
	    hql.append(" group by d.reasonId, year(c.occurDate)) a ");
	    hql.append(" group by a.reason ");
		 
		SQLQuery query = this.getSession().createSQLQuery(hql.toString());
		if(!StrTool.isBlankStr(lineQueryCondition.getDirectionId())){
			query.setParameter("directionId", lineQueryCondition.getDirectionId());
		}
		if(lineQueryCondition.getReasonList() != null){
			query.setParameterList("reasons", lineQueryCondition.getReasonList());
		}
		
		List list1 = query.list();

這裡拼出來的sql是這樣的

SELECT a.reason  
   , Max(CASE a.year WHEN '2008' THEN a.num ELSE 0 END) as m  
   , Max(CASE a.year WHEN '2009' THEN a.num ELSE 0 END) as m  
   , Max(CASE a.year WHEN '2010' THEN a.num ELSE 0 END) as m  
   , Max(CASE a.year WHEN '2011' THEN a.num ELSE 0 END) as m  
   FROM   
		(
			SELECT d.reasonId AS reason  ,YEAR(c.occurDate) AS year  ,COUNT(c.id) AS num  
			FROM   IMPS_RP_ASSET_DAMAGE c, IMPS_RP_ASSET_DAMAGE_MAP d  
			where  c.id = d.assetDamageId  
			group by d.reasonId, year(c.occurDate)
		) a  group by a.reason 


這樣查出來的list中每個元素是陣列物件,陣列物件中的每一個值都被陣列中的第一個值覆蓋,注意看紅色部分是因為sql語句每一列的別名是一樣的,如果拼出來的sql是這樣就不會出現上述問題

SELECT a.reason  
   , Max(CASE a.year WHEN '2008' THEN a.num ELSE 0 END) as m1  
   , Max(CASE a.year WHEN '2009' THEN a.num ELSE 0 END) as m2  
   , Max(CASE a.year WHEN '2010' THEN a.num ELSE 0 END) as m3  
   , Max(CASE a.year WHEN '2011' THEN a.num ELSE 0 END) as m4  
   FROM   
		(
			SELECT d.reasonId AS reason  ,YEAR(c.occurDate) AS year  ,COUNT(c.id) AS num  
			FROM   IMPS_RP_ASSET_DAMAGE c, IMPS_RP_ASSET_DAMAGE_MAP d  
			where  c.id = d.assetDamageId  
			group by d.reasonId, year(c.occurDate)
		) a  group by a.reason 


相關文章