Hibernate的自帶文檔中的多表查詢(xún)操作
select new OjbectC(field1, field2,...) from ObjectA a, ObjectB b ...
缺點(diǎn):
必須聲明并創(chuàng)建類(lèi)ObjectC,只能創(chuàng)建單個(gè)的ObjectC對(duì)象
可以通過(guò)net.sf.hibernate包提供的
Interface ScrollableResults(這個(gè)接口類(lèi)似JDBC中的ResultSet一樣,提供了對(duì)返回結(jié)果集合的遍歷和字段訪問(wèn)方法)
Interface Query( Query接口封裝了對(duì)數(shù)據(jù)庫(kù)的查詢(xún)等操作,主要使用scroll()方法返回一個(gè)ScrollableResults實(shí)例)
public ScrollableResults scroll()
將查詢(xún)結(jié)果以ScrollableResults實(shí)例返回,但需要注意的是查詢(xún)返回的結(jié)果其實(shí)只是一些id,當(dāng)需要的時(shí)候(比如我們使用
ScrollableResults.next()方法后移游標(biāo)時(shí))這條需要用到的記錄才會(huì)被真正初始化(這種技術(shù)可以稱(chēng)作:延時(shí)初始化)
Interface Session(通過(guò)Session的createQuery()方法,生成一個(gè)Query實(shí)例)
.. PO對(duì)象
RsBean.java 用于保存統(tǒng)計(jì)結(jié)果Bean
... PO映射
RsBeanDao.java 統(tǒng)計(jì)Dao定義
RsBeanImpl.java 統(tǒng)計(jì)Dao定義實(shí)現(xiàn)
DaoFactory.java Dao工廠
HibernateSessionFactory.java Session工廠
RsBeanDaoImple .java 代碼:
package test.dao.impl;
import java.util.*;
import test.bean.*;
import test.dao.*;
import net.sf.hibernate.*;
public class RsBeanDaoImple extends RsBeanDao{
// 下面方法集成自TotalChargeDao
public List statTotalCharge(Date statTimeBegin, Date statTimeEnd) throws DaoException{
List res = new Vector();// 將用于存放保存的結(jié)果集合
Session session = null;
ScrollableResults srs = null;
try{
session = HibernateSessionFactory.openSession();// 得到一個(gè)HibernateSession
// 下面創(chuàng)建一個(gè)匿名Query實(shí)例并調(diào)用它的scroll()方法返回以ScrollableResults形式組織的查詢(xún)結(jié)果
srs = session.createQuery(“select b.name, count(a.fee) mix(a.chargeBeginTime) max(a.chargeEndTime) from
charge a,customer b where a.idCustomer = b.idCustomer and a.chargeBeginTime >= ? and a.chargeEndTime < ?
gourp by a.idCustomer“).setDate(0, statTimeBegin).setDate(1, statTimeEnd).scroll();
// 將查詢(xún)結(jié)果放入List保存
while(srs.next()){
res.add(new TotalCharge(srs.getString(0), srs,getDouble(1), srs.getDate(2), srs.getDate(3)));
}
}catch(HibernateException he){
;// loging err.....
if(srs!=null){
try{
srs.close();
}catch(Exception e){
;
}
}
}finally{
try{
session.close();
}catch(Exception e){
;
}
}
return res;
}
}