posts - 325,  comments - 25,  trackbacks - 0
          在平時(shí)開(kāi)發(fā)中Hibernate提供的hql基本能夠滿足我們的日常需求。但是在有些特殊的情況下,還是需要使用原生的sql,并且希望sql查詢出來(lái)的結(jié)果能夠綁定到pojo上。hibernate API中的createSQLQuery 和createQuery接口。
          就像在這次的項(xiàng)目中,因?yàn)楸斫Y(jié)構(gòu)要變化,有個(gè)新的需求:
          要從一個(gè)表中查詢極個(gè)別的字段并且還有幾個(gè)是求多條數(shù)據(jù)的和的,之前一直在使用hibernate的API,使用的都是映射過(guò)得對(duì)象。
          原對(duì)象及表結(jié)構(gòu)是這樣的:
          @Entity @Table(name="T_BILL_ACCT_ITEM") @NamedQuery(name="TBillAcctItem.findAll", query="SELECT t FROM TBillAcctItem t") public class TBillAcctItem implements Serializable { 	private static final long serialVersionUID = 1L; 	@Id 	@Column(name="ACCT_ITEM_ID") 	private long acctItemId; 	 	@Column(name="ACCT_ID") 	private long acctId; 	 	@Column(name="BILLING_CYCLE_ID") 	private String billingCycleId; 	 	@Column(name="PRODUCT_ID") 	private String productId; 	 	@Column(name="SERVICE_ID") 	private String serviceId; 	 	@Column(name="ACCT_ITEM_CODE") 	private String acctItemCode; 	 	@Column(name="ORIGINAL_AMOUNT") 	private int originalAmount; 	 	@Column(name="CDR_DISCOUNT") 	private int cdrDiscount; 	 	@Column(name="ACCT_DISCOUNT") 	private int acctDiscount; 	 	@Column(name="RECE_AMOUNT") 	private int receAmount; 	 	@Column(name="REAL_AMOUNT") 	private int realAmount; 	 	@Column(name="CHARGE_OFF_SOURCE") 	private int chargeOffSource; 	 	@Column(name="STATE") 	private int state;
          但是我現(xiàn)在需要查詢出來(lái)的信息是這樣的一個(gè)pojo類(lèi):
          public class ProductBillInfo implements Serializable{  	private static final long serialVersionUID = 1L; 	private String productId;//產(chǎn)品標(biāo)識(shí) 	private String serverId;//服務(wù)標(biāo)示 	private int realAmount;//實(shí)收金額(sum求和) 	private int receAmount;//應(yīng)收金額(sum求和) 	private int state;//賬目狀態(tài) 	private String billingCycle;//賬期(月)

          因?yàn)?span id="7_nwp" style="width: auto; height: auto; float: none;">hibernate要查詢的對(duì)象是要和表結(jié)構(gòu)一一映射的,現(xiàn)在求和字段這些個(gè)是映射不了的,
          之前的方法就有問(wèn)題了。 找了很多看了hibernate的API 找到這個(gè)東西。 如下:
          大概的使用過(guò)程:
                  StringBuffer b = new StringBuffer();   	//... 省略SQL拼接代碼   	String sql = b.toString();   	SQLQuery query = session.createSQLQuery(sql);  	query.addScalar("productId", StandardBasicTypes.STRING);//要查詢出來(lái)的字段、類(lèi)型 	List<ProductBillInfo> lnfo =query.list();

          下面是我用到的查詢pojo的方法中的實(shí)現(xiàn):
          @SuppressWarnings("unchecked") 	public List<ProductBillInfo> findByAcctIdAndCycle1(long acctId, 			String cycleBegin, String cycleEnd, int state){ 		 		List<String> cycles = DateUtil.getAllCycle(cycleBegin, cycleEnd); 		StringBuffer buf = new StringBuffer(); 		buf.append("select t.PRODUCT_ID as productId , t.SERVICE_ID as  serviceId ," + 		"sum(t.REAL_AMOUNT) as  realAmount  ,sum(t.RECE_AMOUNT) as  receAmount ," + 		"t.STATE as state ,t.BILLING_CYCLE_ID as  billingCycleId " + 		" from T_BILL_ACCT_ITEM t where t.STATE= '" + state + "' AND t.ACCT_ID='" + acctId + "' AND t.BILLING_CYCLE_ID in ("); 		StringBuffer bf = new StringBuffer(); 		for(String id : cycles){ 			   if(bf.toString().equals("")){ 				   bf.append("'"+id+"'"); 			   } else{ 				   bf.append(","+"'"+id+"'"); 			   } 		} 		buf.append(bf.toString()); 		buf.append(") GROUP BY t.PRODUCT_ID,t.BILLING_CYCLE_ID,t.SERVICE_ID"); 		 		SQLQuery query = getSession().createSQLQuery(buf.toString());   		query.addScalar("productId", StandardBasicTypes.STRING); 		query.addScalar("serviceId", StandardBasicTypes.STRING); 		query.addScalar("realAmount", StandardBasicTypes.INTEGER); 		query.addScalar("receAmount", StandardBasicTypes.INTEGER); 		query.addScalar("state", StandardBasicTypes.INTEGER); 		query.addScalar("billingCycleId", StandardBasicTypes.STRING); 		 		query.setResultTransformer(Transformers.aliasToBean(ProductBillInfo.class));   		List<ProductBillInfo> lnfo =query.list(); 		return lnfo; 	}
          需要說(shuō)明的一點(diǎn)是
          query.addScalar("deviceId",Hibernate.STRING); ,老版本的使用的數(shù)據(jù)的類(lèi)型都是 org.hibernate.type包下面的,
          新版本的是在:org.hibernate.type.StandardBasicTypes包下面的
          并且在語(yǔ)法中要使用到in(‘’、‘’、‘’)的語(yǔ)法,于是寫(xiě)了下面的一個(gè)拼接小方法:
          public static void main(String[] args) { 		List<String> c = new ArrayList<String>(); 		c.add("1");c.add("2");c.add("3"); 		StringBuffer bf = new StringBuffer(); 		for(String id : c){ 			   if(bf.toString().equals("")){ 				   bf.append("'"+id+"'"); 			   } else{ 			       bf.append(","+"'"+id+"'"); 			   } 			} 		System.out.println(bf.toString()); 	} 
          打印結(jié)果是: '1','2','3'
          使用StringBuffer拼接到原生的sql語(yǔ)句中
          轉(zhuǎn)自:http://www.aichengxu.com/view/35553
          posted on 2015-08-12 09:41 長(zhǎng)春語(yǔ)林科技 閱讀(818) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): hibernate
          <2015年8月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

           

          長(zhǎng)春語(yǔ)林科技?xì)g迎您!

          常用鏈接

          留言簿(6)

          隨筆分類(lèi)

          隨筆檔案

          文章分類(lèi)

          文章檔案

          相冊(cè)

          收藏夾

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 桑植县| 高密市| 额敏县| 邛崃市| 玉溪市| 常山县| 桓台县| 扎兰屯市| 虞城县| 久治县| 麻城市| 乐业县| 文山县| 同德县| 东乌| 苏尼特左旗| 石屏县| 崇信县| 呼图壁县| 嘉义县| 肃北| 永靖县| 玉林市| 黄冈市| 九江市| 上饶县| 南皮县| 东港市| 安岳县| 永安市| 乐亭县| 公安县| 东城区| 湖北省| 历史| 特克斯县| 永定县| 西平县| 喜德县| 德令哈市| 进贤县|