下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Hibernate是典型的OPM工具,它将每一个物理表格( Table )映射成为对象(Object ), 这发挥了面向对象的优势,使设计和开发人员可以从面向对象的角度来进行对数据库的管理。在设计到多表操作时,Hibernate提供了与数据库表关系相对应的对象映射关系,一对 一、一对多和多对多在这里都可以通过Hibernate的对象映射关系(Set等)来实现。这为一般情况下的数据库多表操作提供了便捷途径。关于这方面的介绍已经很多,在这里不再复述。但是,在有些情况下的多表操作,比如一个统计顾客在 2005年的消费总金额的 SQL操作如下:select b.n ame, coun t(a.fee)
2、 mix(a.chargeBegi nTime) max(a.chargeE ndTime) from chargea, customer b where a.idCustomer = b.idCustomer and a.chargeBeg in Time >='2005-01-01' and a.chargeEndTime < '2005-12-31' gourp by a.idCustomer customer 表禾口 charge 结构如下:customer 表结构:| Field | Type | Null | Key | Default
3、| Extra | IdCustomer | varchar(32) | PRI | Name | varchar(30) | charge表结构:| Field| Type | Null | Key | Default | Extra | IdCharge| varchar(32) | PRI | Fee| double | YES | NULL | ChargeTimeBegin | datetime | YES | NULL | ChargeTimeE nd | datetime | YES | NULL |在Hibernate的自带文档中有类似下面的多表查询操作提示:“ select
4、new OjbectC(field1, field2,.) from ObjectA a, ObjectB b .,”分析一下可以看出这个操作有两个缺点:1) 必须声明并创建类 ObjectC,根据Hibernate的特点,需要写一个 ObjectC.hbm. XML 的PO映射,在只用到创建查询结果的新对象的时候,这个映射可以是个虚的, 即可以没有 一个真正的数据库表和 ObjectC对应,但是这样的一个虚设的逻辑显然已经违背了Hibernate的思想初衷;2) 这个办法只能查询出但条结果记录并只能创建单个的ObjectC对象,这是很局限的, 因此在某些情况下根本不能使用(比如本例)。所以,
5、对于本例,上面的方法是行不通的。其实,仔细看看Hibernate的API,就会发现这个问题很好解决。在net.sf.hibernate包中1、In terface ScrollableResults这个接口类似 法,如:public boolea n public boolea n public boolea n有下面三个对我们很有用的接口:JDBC中的ResultSet 样,提供了对返回结果集合的遍历和字段访问方next ()游标后移previous ()游标前移 scroll (int i)游标移动到指定未知Object get ()将当前记录的字段值以Object对象数组形式返回Obje
6、ct get (int i)将当前记录的特定字段值以 Object对象形式返回 Integer getInteger (int col)将当前记录的特定字段值以 Long getLong (int col)将当前记录的特定字段值以 String getText (int col)将当前记录的特定字段值以 String getString (int col)将当前记录的特定字段值以Integer对象返回 Long对象返回 Text对象返回String对象返回public void beforeFirst () 游标在首记录前 public void afterLast () 游标在末记录后 pu
7、blic public public public public public连连. 等等2、In terface QueryQuery接口封装了对数据库的查询等操作,在这里,我们使用到它的原因是在于它的scroll()方法可以返回一个ScrollableResults 实例:public ScrollableResults scroll ()将查询结果以 ScrollableResults实例返回,但需要注意的是查询返回的结果其实只是一些id,当需要的时候(比如我们使用ScrollableResults. next()方法后移游标时)这条需要用到的记录才会被真正初始化(这种技术可以称作:延时
8、初始化)3、In terface Sessi onSession是Hibernate 的核心中的核心,通过Session的createQuery()方法,我们能生成一个Query实例:public Query createQuery (String queryString) 用给出的 HQL 查询串创建一个 Query 实例 好了,了解了上面的三个接口,问题就能够很好的解决了。需要如下几个文件:PO对象PO对象用于保存统计结果 BeanPO映射PO映射统计Dao定义统计Dao定义实现Dao工厂Session 工厂Customer. JavaCharge.javaTotalCharge.java
9、Customer.hbm.xmlCharge.hbm.xmlTotalChargeDao.javaTotalChargeDaoImpl.javaDaoFactory.javaHiber nateSessi onF actory.java因为这里主要讨论的重点是对Customer 和 Charge 的联合查询,所以 Customer.java、Charge.java、Customer.hbm.xml 、Charge.hbm.xml四个文件以及 TotalChargeDao.java 、DaoFactory.java 、HibernateSessionFactory.java的源代码在这里省略掉。
10、TotalCharge.java的源代码:package test.bean;/*作者:孙星*/public class TotalCharge private String name;private Double fee;private java.util.Date chargeTimeBegin;private java.util.Date chargeTimeEnd;public TotalCharge() public String getName() return name;public TotalCharge(String name, Double fee, java.util.D
11、ate chargeTimeBegin,java.util.Date chargeTimeEnd) = name;this.fee = fee;this.chargeTimeBegin = chargeTimeBegin;this.chargeTimeEnd = chargeTimeEnd;public void setName(String name) = name;public Double getFee() return fee;public void setFee(Double fee) this.fee = fee;public java.ut
12、il.Date getChargeTimeBegin() return chargeTimeBegin;public void setChargeTimeBegin(java.util.Date chargeTimeBegin) this.chargeTimeBegin = chargeTimeBegin;public java.util.Date getChargeTimeEnd() return chargeTimeEnd;public void setChargeTimeEnd(java.util.Date chargeTimeEnd) this.chargeTimeEnd = char
13、geTimeEnd;TotalChargeDaoImpl.java 代码:package test.dao.impl;import java.util.*;import test.bean.*;import test.dao.*;import net.sf.hibernate.*;/* *作者:孙星 */ public class TotalChargeDaoImple extends TotalChargeDao下面方法集成自TotalChargeDaopublic List statTotalCharge(Date statTimeBegin, Date statTimeEnd) thro
14、ws DaoExceptionList res = new Vector(); 将用于存放保存的结果集合Session session = null;ScrollableResults srs = null;trysession = HibernateSessionFactory.openSession();得至U个 Hibernate Session/下面创建一个匿名 Query实例并调用它的scroll()方法返回以ScrollableResults 形式组织的查询结果srs = session.createQuery( “ select , count(a.fee) mix(
15、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.
16、getString(0), srs,getDouble(1), srs.getDate(2), srs.getDate(3);catch(HibernateException he);/loging err.if(srs!=null)trysrs.close();catch(Exception e)Jfinallytrysession.close();catch(Exception e)Jreturn res;看,现在问题解决了。坐下来,喝杯Java吧!Hibernate的多表查询Hibernate的多表查询Query query = sessi on. createQuery("select t,c from Cat as c,Custom as t wherec.sex = :sex and c.id = t.id");query.setCharacter("sex", 'F');for (Iterator it = query.iterate(); it.hasNext(); ) Object queryArray = (Object)it.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 航空业飞行员培训与考核标准详述手册
- 电商运营平台推广人员绩效衡量表
- IT运维工程师服务器故障紧急处理方案手册
- 智慧仓储管理系统优化策略
- 函询关于2026年市场调研数据5篇范本
- 餐饮业油烟净化设备维护管理标准流程手册
- 炼钢企业焊工日常检查安全操作规程
- 金属冶炼企业电工运行操作安全操作规程
- 教育机构教学督导教学品质与师资培训KPI考核表
- 儿科中医试卷题目及答案
- 公司总经理2026年工作总结及2026年工作计划
- 2025年临夏州中小学教师招聘考试真题及答案
- 鲜风生活数字化转型
- 日本佛教革新之光:亲鸾判教思想的深度剖析与时代映照
- 日伪统治下赤峰地区经济的畸变与苦难:1933 - 1945
- ICU多学科协作诊疗模式
- 2026年跨境电商店铺授权合同协议
- 旅游度假村开发与管理规范(标准版)
- (2025版)月经性偏头痛诊断和治疗中国专家共识课件
- 医院后勤安全生产管理考核方案
- 高二英语(人教版)试题 选择性必修一 UNIT 1 课时检测(一)“Reading and Thinking”
评论
0/150
提交评论