Hibernate的自带文档中的多表查询操作
select new OjbectC(field1, field2,...) from ObjectA a, ObjectB b ...
缺点:
必须声明并创建类ObjectC,只能创建单个的ObjectC对象
可以通过net.sf.hibernate包提供的
Interface ScrollableResults(这个接口类似JDBC中的ResultSet一样,提供了对返回结果集合的遍历和字段访问方法)
Interface Query( Query接口封装了对数据库的查询等操作,主要使用scroll()方法返回一个ScrollableResults实例)
public
ScrollableResults scroll()
将查询结果以ScrollableResults实例返回,但需要注意的是查询返回的结果其实只是一些id,当需要的时候(比如我们使用
ScrollableResults.next()方法后移游标时)这条需要用到的记录才会被真正初始化(这种技术可以称作:延时初始化)
Interface Session(通过Session的createQuery()方法,生成一个Query实例)
.. PO对象
RsBean.java 用于保存统计结果Bean
... PO映射
RsBeanDao.java 统计Dao定义
RsBeanImpl.java 统计Dao定义实现
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();// 将用于存放保存的结果集合
Session session = null;
ScrollableResults srs = null;
try{
session = HibernateSessionFactory.openSession();// 得到一个HibernateSession
// 下面创建一个匿名Query实例并调用它的scroll()方法返回以ScrollableResults形式组织的查询结果
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();
// 将查询结果放入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;
}
}
posted on 2007-06-29 11:17
李大嘴 阅读(676)
评论(0) 编辑 收藏