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

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

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

    飛艷小屋

    程序--人生--哲學(xué)___________________歡迎艷兒的加入

    BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
      52 Posts :: 175 Stories :: 107 Comments :: 0 Trackbacks
    Hibernate是典型的OPM工具,它將每一個(gè)物理表格(Table)映射成為對(duì)象(Object),這發(fā)揮了面向?qū)ο蟮膬?yōu)勢(shì),使設(shè)計(jì)和開(kāi)發(fā)人員可以從面向?qū)ο蟮慕嵌葋?lái)進(jìn)行對(duì)數(shù)據(jù)庫(kù)的管理。
    ????在設(shè)計(jì)到多表操作時(shí),Hibernate提供了與數(shù)據(jù)庫(kù)表關(guān)系相對(duì)應(yīng)的對(duì)象映射關(guān)系,一對(duì)一、一對(duì)多和多對(duì)多在這里都可以通過(guò)Hibernate的對(duì)象映射關(guān)系(Set等)來(lái)實(shí)現(xiàn)。這為一般情況下的數(shù)據(jù)庫(kù)多表操作提供了便捷途徑。關(guān)于這方面的介紹已經(jīng)很多,在這里不再?gòu)?fù)述。
    ????但是,在有些情況下的多表操作,比如一個(gè)統(tǒng)計(jì)顧客在2005年的消費(fèi)總金額的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結(jié)構(gòu)如下:

    customer表結(jié)構(gòu):
    +------------+-------------+------+-----+---------+-------+
    | Field????? | Type??????? | Null | Key | Default | Extra |
    +------------+-------------+------+-----+---------+-------+
    | IdCustomer | varchar(32) |????? | PRI |???????? |?????? |
    | Name?????? | varchar(30) |????? |???? |???????? |?????? |
    +------------+-------------+------+-----+---------+-------+

    charge表結(jié)構(gòu):
    +-----------------+-------------+------+-----+---------+-------+
    | Field?????????? | Type??????? | Null | Key | Default | Extra |
    +-----------------+-------------+------+-----+---------+-------+
    | IdCharge??????? | varchar(32) |????? | PRI |???????? |?????? |
    | Fee???????????? | double????? | YES? |???? | NULL??? |?????? |
    | ChargeTimeBegin | datetime??? | YES? |???? | NULL??? |?????? |
    | ChargeTimeEnd?? | datetime??? | YES? |???? | NULL??? |?????? |
    +-----------------+-------------+------+-----+---------+-------+

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

    其實(shí),仔細(xì)看看Hibernate的API,就會(huì)發(fā)現(xiàn)這個(gè)問(wèn)題很好解決。在net.sf.hibernate包中有下面三個(gè)對(duì)我們很有用的接口:

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

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

    3、Interface Session
    ????Session是Hibernate的核心中的核心,通過(guò)Session的createQuery()方法,我們能生成一個(gè)Query實(shí)例:
    ????public QuerycreateQuery(String?queryString) 用給出的HQL查詢(xún)串創(chuàng)建一個(gè)Query實(shí)例

    好了,了解了上面的三個(gè)接口,問(wèn)題就能夠很好的解決了。需要如下幾個(gè)文件:
    Customer.java????????????????????????????PO對(duì)象
    Charge.java????????????????????????????????PO對(duì)象
    TotalCharge.java????????????????????????用于保存統(tǒng)計(jì)結(jié)果Bean
    Customer.hbm.xml??????????????????????PO映射
    Charge.hbm.xml??????????????????????????PO映射
    TotalChargeDao.java??????????????????統(tǒng)計(jì)Dao定義
    TotalChargeDaoImpl.java???????????統(tǒng)計(jì)Dao定義實(shí)現(xiàn)
    DaoFactory.java???????????????????????? Dao工廠
    HibernateSessionFactory.java?????Session工廠

    因?yàn)檫@里主要討論的重點(diǎn)是對(duì)Customer和Charge的聯(lián)合查詢(xún),所以Customer.java、Charge.java、Customer.hbm.xml、Charge.hbm.xml四個(gè)文件以及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();//將用于存放保存的結(jié)果集合
    ????????Session session = null;
    ????????ScrollableResults srs?= null;
    ????????try{
    ????????????session = HibernateSessionFactory.openSession();//得到一個(gè)Hibernate Session
    ????????????//下面創(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;
    ????}
    }

    ????看,現(xiàn)在問(wèn)題解決了。坐下來(lái),喝杯Java吧!?

    posted on 2007-03-31 21:20 天外飛仙 閱讀(896) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): hibernate
    主站蜘蛛池模板: 亚洲成a人片在线观看中文动漫| 日本在线高清免费爱做网站| 男人j进女人p免费视频| 亚洲精品无码成人| 亚洲欧好州第一的日产suv| 四虎必出精品亚洲高清| 亚洲二区在线视频| 亚洲激情视频图片| 亚洲午夜无码久久| 亚洲中文字幕无码av| 亚洲熟妇无码一区二区三区导航| 亚洲综合激情五月色一区| 亚洲乱亚洲乱妇无码| 久久亚洲精品无码av| 黄页网址大全免费观看12网站| 农村寡妇一级毛片免费看视频| 免费国产va在线观看| 中文字幕无线码中文字幕免费| 国产在线播放线91免费 | 中文字幕亚洲一区二区三区| 亚洲国产成人影院播放| 国产精品亚洲αv天堂无码| 亚洲乱码精品久久久久..| 久久精品国产精品亚洲艾草网| 久久亚洲精品成人AV| 久久亚洲精品专区蓝色区| 亚洲人成网站色7799| 黄网站色成年片大免费高清| free哆拍拍免费永久视频| 日韩免费视频一区二区| 免费下载成人电影| 四虎永久精品免费观看| 国产亚洲精品AA片在线观看不加载 | 老司机精品视频免费| GOGOGO免费观看国语| 久久永久免费人妻精品下载 | 粉色视频免费入口| a级毛片无码免费真人久久| 最近中文字幕免费2019| 日韩免费视频一区| 国产亚洲老熟女视频|