<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    飛艷小屋

    程序--人生--哲學___________________歡迎艷兒的加入

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      52 Posts :: 175 Stories :: 107 Comments :: 0 Trackbacks
    Hibernate是典型的OPM工具,它將每一個物理表格(Table)映射成為對象(Object),這發揮了面向對象的優勢,使設計和開發人員可以從面向對象的角度來進行對數據庫的管理。
    ????在設計到多表操作時,Hibernate提供了與數據庫表關系相對應的對象映射關系,一對一、一對多和多對多在這里都可以通過Hibernate的對象映射關系(Set等)來實現。這為一般情況下的數據庫多表操作提供了便捷途徑。關于這方面的介紹已經很多,在這里不再復述。
    ????但是,在有些情況下的多表操作,比如一個統計顧客在2005年的消費總金額的SQL操作如下:
    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 >= '2005-01-01' and a.chargeEndTime < '2005-12-31' gourp by a.idCustomer
    customer表和charge結構如下:

    customer表結構:
    +------------+-------------+------+-----+---------+-------+
    | Field????? | Type??????? | Null | Key | Default | 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??? |?????? |
    | ChargeTimeEnd?? | datetime??? | YES? |???? | NULL??? |?????? |
    +-----------------+-------------+------+-----+---------+-------+

    在Hibernate的自帶文檔中有類似下面的多表查詢操作提示:
    “select new OjbectC(field1, field2,...) from ObjectA a, ObjectB b ...”,
    分析一下可以看出這個操作有兩個缺點:
    ????1)必須聲明并創建類ObjectC,根據Hibernate的特點,需要寫一個ObjectC.hbm.xml的PO映射,在只用到創建查詢結果的新對象的時候,這個映射可以是個虛的,即可以沒有一個真正的數據庫表和ObjectC對應,但是這樣的一個虛設的邏輯顯然已經違背了Hibernate的思想初衷;
    ????2)這個辦法只能查詢出但條結果記錄并只能創建單個的ObjectC對象,這是很局限的,因此在某些情況下根本不能使用(比如本例)。
    ????所以,對于本例,上面的方法是行不通的。

    其實,仔細看看Hibernate的API,就會發現這個問題很好解決。在net.sf.hibernate包中有下面三個對我們很有用的接口:

    1、Interface ScrollableResults
    ????這個接口類似JDBC中的ResultSet一樣,提供了對返回結果集合的遍歷和字段訪問方法,如:
    ????public boolean next()????游標后移
    ????public boolean previous() 游標前移
    ????public boolean scroll(int?i) 游標移動到指定未知
    ????public void beforeFirst() 游標在首記錄前
    ????public void afterLast() 游標在末記錄后
    ????public Object[] get() 將當前記錄的字段值以Object對象數組形式返回
    ????public Objectget(int?i) 將當前記錄的特定字段值以Object對象形式返回
    ????public IntegergetInteger(int?col) 將當前記錄的特定字段值以Integer對象返回
    ????public LonggetLong(int?col) 將當前記錄的特定字段值以Long對象返回
    ????public StringgetText(int?col) 將當前記錄的特定字段值以Text對象返回
    ????public StringgetString(int?col) 將當前記錄的特定字段值以String對象返回
    ????...等等

    2、Interface Query
    ????Query接口封裝了對數據庫的查詢等操作,在這里,我們使用到它的原因是在于它的scroll()方法可以返回一個ScrollableResults實例:
    ????public ScrollableResultsscroll() 將查詢結果以ScrollableResults實例返回,但需要注意的是查詢返回的結果其實只是一些id,當需要的時候(比如我們使用ScrollableResults.next()方法后移游標時)這條需要用到的記錄才會被真正初始化(這種技術可以稱作:延時初始化)

    3、Interface Session
    ????Session是Hibernate的核心中的核心,通過Session的createQuery()方法,我們能生成一個Query實例:
    ????public QuerycreateQuery(String?queryString) 用給出的HQL查詢串創建一個Query實例

    好了,了解了上面的三個接口,問題就能夠很好的解決了。需要如下幾個文件:
    Customer.java????????????????????????????PO對象
    Charge.java????????????????????????????????PO對象
    TotalCharge.java????????????????????????用于保存統計結果Bean
    Customer.hbm.xml??????????????????????PO映射
    Charge.hbm.xml??????????????????????????PO映射
    TotalChargeDao.java??????????????????統計Dao定義
    TotalChargeDaoImpl.java???????????統計Dao定義實現
    DaoFactory.java???????????????????????? Dao工廠
    HibernateSessionFactory.java?????Session工廠

    因為這里主要討論的重點是對Customer和Charge的聯合查詢,所以Customer.java、Charge.java、Customer.hbm.xml、Charge.hbm.xml四個文件以及TotalChargeDao.java、DaoFactory.java、HibernateSessionFactory.java的源代碼在這里省略掉。

    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.Date chargeTimeBegin,
    ???????????????????? java.util.Date chargeTimeEnd) {
    ??? this.name = name;
    ??? this.fee = fee;
    ??? this.chargeTimeBegin = chargeTimeBegin;
    ??? this.chargeTimeEnd = chargeTimeEnd;
    ? }

    ? public void setName(String name) {
    ??? this.name = name;
    ? }

    ? public Double getFee() {
    ??? return fee;
    ? }

    ? public void setFee(Double fee) {
    ??? this.fee = fee;
    ? }

    ? public java.util.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 = chargeTimeEnd;
    ? }
    }


    TotalChargeDaoImpl.java 代碼:
    package test.dao.impl;

    import java.util.*;
    import test.bean.*;
    import test.dao.*;
    import net.sf.hibernate.*;

    /**
    ?*作者:孫星
    ?**/
    public class TotalChargeDaoImple extends TotalChargeDao{
    ????
    ????//下面方法集成自TotalChargeDao
    ????public List statTotalCharge(Date statTimeBegin, Date statTimeEnd) throws DaoException{
    ????????List res = new Vector();//將用于存放保存的結果集合
    ????????Session session = null;
    ????????ScrollableResults srs?= null;
    ????????try{
    ????????????session = HibernateSessionFactory.openSession();//得到一個Hibernate Session
    ????????????//下面創建一個匿名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;
    ????}
    }

    ????看,現在問題解決了。坐下來,喝杯Java吧!?

    posted on 2007-03-31 21:20 天外飛仙 閱讀(897) 評論(0)  編輯  收藏 所屬分類: hibernate
    主站蜘蛛池模板: 亚洲乱码一二三四区乱码| 国产成人亚洲综合在线| 免费无码肉片在线观看| 国产亚洲精品免费| 亚洲啪啪AV无码片| 日韩精品无码区免费专区| 一级毛片在播放免费| 亚洲精品无码久久久久久久| 国产免费拔擦拔擦8x| 国产精品免费看久久久| 亚洲AV无码一区二区三区网址| 亚洲免费观看视频| 亚色九九九全国免费视频| 又大又硬又粗又黄的视频免费看 | 久久亚洲精品成人av无码网站| 九九九精品成人免费视频| 国产性生大片免费观看性| 一区二区亚洲精品精华液| 亚洲熟妇丰满多毛XXXX| a级毛片无码免费真人| 日韩电影免费在线观看中文字幕 | 成全动漫视频在线观看免费高清版下载| 国产精品亚洲午夜一区二区三区| 久久亚洲国产精品五月天婷| 无码免费午夜福利片在线| 东方aⅴ免费观看久久av| 亚洲av日韩专区在线观看| 亚洲国产中文在线视频| 亚洲欧洲精品无码AV| 国产伦一区二区三区免费| 成人免费大片免费观看网站| 东北美女野外bbwbbw免费 | 国精产品一区一区三区免费视频| 亚洲精品国产综合久久久久紧 | 97国免费在线视频| 亚洲av无码专区在线观看下载| 亚洲欧洲一区二区| 亚洲色成人中文字幕网站| 又粗又大又硬又爽的免费视频| 国产日本一线在线观看免费| 久久大香香蕉国产免费网站|