Hibernate的凝乳的封裝和的HQL的多表查詢:

本身寫的一個Hibernate的凝乳的封裝

本身在dome一個小項目的時候,突發奇想,利用單例和工廠加上泛型的知識封裝Po的CURD操做,直接上代碼,文筆很差,呵呵,還請你們指教 

接口規範,定義凝乳操做 
Java的代碼[IMG] http://www.javaeye.com/images/icon_copy.gif [/ IMG]
包edu.sasu.DAO;   
  
進口的java.util.List;   

  
  
/ **  
*全部實體類遵循的接口  
* @做者管理員  
*  
* @參數<T>  
* _AT_參數<ID>  
* /  
公共接口BaseDao <T> {   
  
    / **  
     *保存實體  
     * @參數實體的實體類  
     * /  
    公共布爾保存(操實體);   
       
    / **  
     *刪除實體  
     * @參數實體的實體類  
     * /  
    公共布爾刪除(操實體);   
       
    / **  
     *根據實體的ID刪除實體  
     * @參數實體的實體類  
     * /  
    公共布爾deleteById(操實體);   
       
    / **  
     *跟新實體  
     * @參數實體的實體類  
     * /  
    / /公共布爾更新(操實體);   
    公共布爾更新(操實體,對象的OID);   
    / **  
     *根據實體D,查詢單個實體  
     * @參數實體的實體類   
     * @返回  
     * /  
    / /公共ţfindById(操實體);   
    (操實體,對象entityID),公共ţfindById;   
    / **  
     *累出全部實體集合  
     * @的參數entityClass實體類  
     * @返回實體類名單  
     * /  
    公共的名單<T>的findAll(絃樂HQL);   
       
    公共的名單<T>的findAll(操實體);   
       
    / **  
     *保存和跟新方法  
     * /  
    公共布爾saveOrUpdate(操實體);   
}  

包edu.sasu.DAO;

進口的java.util.List;


/ **
*全部實體類遵循的接口
* @做者管理員
*
* @參數<T>
* _AT_參數<ID>
* /
公共接口BaseDao <T> {

        / **
         *保存實體
         * @參數實體的實體類
         * /
        公共布爾保存(操實體);
        
        / **
         *刪除實體
         * @參數實體的實體類
         * /
        公共布爾刪除(操實體);
        
        / **
         *根據實體的ID刪除實體
         * @參數實體的實體類
         * /
        公共布爾deleteById(操實體);
        
        / **
         *跟新實體
         * @參數實體的實體類
         * /
        / /公共布爾更新(操實體);
        公共布爾更新(操實體,對象的OID);
        / **
         *根據實體D,查詢單個實體
         * @參數實體的實體類 
         * @返回
         * /
        / /公共ţfindById(操實體);
        (操實體,對象entityID),公共ţfindById;
        / **
         *累出全部實體集合
         * @的參數entityClass實體類
         * @返回實體類名單
         * /
        公共的名單<T>的findAll(絃樂HQL);
        
        公共的名單<T>的findAll(操實體);
        
        / **
         *保存和跟新方法
         * /
        公共布爾saveOrUpdate(操實體);
}



實現BaseDao接口,實現其中的方法 
Java的代碼[IMG] http://www.javaeye.com/images/icon_copy.gif [/ IMG]
包edu.sasu.DAOImpl;   
  
進口了java.io.Serializable;   
進口的java.util.ArrayList;   
進口的java.util.List;   
  
進口持久性單元對話框;   
導入org.hibernate.Session;   
導入org.hibernate.Transaction;   
  
導入edu.sasu.DAO.BaseDao;   
導入edu.sasu.Util.DBUtil;   
/ **  
*封裝的基類操做  
* @做者管理員  
*  
* @參數<T>  
* /  
公共類BaseDAOImpl <T>實現BaseDao <T> {   
    市民同步布爾刪除(操實體){   
        / / TODO自動生成方法存根   
        返回false;   
    }   
    / **  
     *刪除某條數據  
     * /  
    市民同步布爾deleteById(操實體){   
        屆會議DBUtil.getDBUtil()getSession();   
        交易TX = NULL;   
        嘗試{   
            TX = session.beginTransaction();   
            使用Session.delete(實體);   
            tx.commit();   
        }遇上(HibernateException的E){   
            (TX = NULL){   
                tx.rollback();   
            }   
            返回false;   
        }   
        返回true;   
    }   
  
    市民同步列表<T>的findAll(操實體){   
        / / TODO自動生成方法存根   
        返回null;   
    }   
    / **  
     *查找單個數據  
     * /  
    市民同步ţfindById(操實體,對象entityID),{   
        屆會議DBUtil.getDBUtil()getSession();   
        交易TX = NULL;   
        ţ溫度;   
        嘗試{   
            TX = session.beginTransaction();   
            TEMP =(T)的session.get(entity.getClass(),(序列化)entityID);   
            tx.commit();   
        }遇上(HibernateException的E){   
            (TX = NULL){   
                tx.rollback();   
            }   
            投射E;   
        }最後{   
               
        }   
        返回溫度;   
    }   
    / **  
     *保存數據  
     * /  
    市民同步布爾保存(操實體){   
        屆會議DBUtil.getDBUtil()getSession();   
        交易TX = NULL;   
        嘗試{   
            TX = session.beginTransaction();   
            / / session.persist(實體);   
            的session.save(實體);   
            tx.commit();   
        }遇上(HibernateException的E){   
            (TX = NULL){   
                tx.rollback();   
            }   
            / /返回false;   
            論壇主題貼();   
        }   
        返回true;   
    }   
    / **  
     *跟新數據  
     * /  
    市民同步布爾更新(操實體,對象的OID){   
        屆會議DBUtil.getDBUtil()getSession();   
        交易TX = NULL;   
           
        嘗試{   
            TX = session.beginTransaction();       
            ţTEMP =(T)的session.get(entity.getClass(),(序列化)的OID);   
            session.merge(實體)/ /若是更新要拋異常;   
            tx.commit();   
        }遇上(HibernateException的E){   
            (TX = NULL){   
                tx.rollback();   
            }   
            / /返回false;   
            論壇主題貼();   
        }   
        返回true;   
    }   
    / **  
     *查找符合HQL的全部數據  
     * /  
    市民同步列表<T>的findAll(絃樂HQL){   
        屆會議DBUtil.getDBUtil()getSession();   
        交易TX = NULL;   
        名單<T>列表=新的ArrayList <T>();   
        嘗試{   
            TX = session.beginTransaction();   
            列表= session.createQuery(HQL)名單();   
            session.flush();   
            tx.commit();   
        }遇上(HibernateException的E){   
            (TX = NULL){   
                tx.rollback();   
            }   
            論壇主題貼();   
        }   
        返回列表;   
    }   
       
    / **  
     *保存和跟新方法  
     * /  
    市民同步布爾saveOrUpdate(操實體){   
        屆會議DBUtil.getDBUtil()getSession();   
        交易TX = NULL;   
        嘗試{   
            TX = session.beginTransaction();   
            session.saveOrUpdate(實體);   
            tx.commit();   
        }遇上(HibernateException的E){   
            (TX = NULL){   
                tx.rollback();   
            }   
            / /返回false;   
            論壇主題貼();   
        }   
        返回true;   
    }   
}  

包edu.sasu.DAOImpl;

進口了java.io.Serializable;
進口的java.util.ArrayList;
進口的java.util.List;

進口持久性單元對話框;
導入org.hibernate.Session;
導入org.hibernate.Transaction;

導入edu.sasu.DAO.BaseDao;
導入edu.sasu.Util.DBUtil;
/ **
*封裝的基類操做
* @做者管理員
*
* @參數<T>
* /
公共類BaseDAOImpl <T>實現BaseDao <T> {
        市民同步布爾刪除(操實體){
                / / TODO自動生成方法存根
                返回false;
        }
    / **
     *刪除某條數據
     * /
        市民同步布爾deleteById(操實體){
                屆會議DBUtil.getDBUtil()getSession();
                交易TX = NULL;
                嘗試{
                        TX = session.beginTransaction();
                        使用Session.delete(實體);
                        tx.commit();
                }遇上(HibernateException的E){
                        (TX = NULL){
                                tx.rollback();
                        }
                        返回false;
                }
                返回true;
        }

        市民同步列表<T>的findAll(操實體){
                / / TODO自動生成方法存根
                返回null;
        }
    / **
     *查找單個數據
     * /
        市民同步ţfindById(操實體,對象entityID),{
                屆會議DBUtil.getDBUtil()getSession();
                交易TX = NULL;
                ţ溫度;
                嘗試{
                        TX = session.beginTransaction();
                        TEMP =(T)的session.get(entity.getClass(),(序列化)entityID);
                        tx.commit();
                }遇上(HibernateException的E){
                        (TX = NULL){
                                tx.rollback();
                        }
                        投射E;
                }最後{
                        
                }
                返回溫度;
        }
    / **
     *保存數據
     * /
        市民同步布爾保存(操實體){
                屆會議DBUtil.getDBUtil()getSession();
                交易TX = NULL;
                嘗試{
                        TX = session.beginTransaction();
                        / / session.persist(實體);
                        的session.save(實體);
                        tx.commit();
                }遇上(HibernateException的E){
                        (TX = NULL){
                                tx.rollback();
                        }
                        / /返回false;
                        論壇主題貼();
                }
                返回true;
        }
    / **
     *跟新數據
     * /
        市民同步布爾更新(操實體,對象的OID){
                屆會議DBUtil.getDBUtil()getSession();
                交易TX = NULL;
                
                嘗試{
                        TX = session.beginTransaction();        
                        ţTEMP =(T)的session.get(entity.getClass(),(序列化)的OID);
                        session.merge(實體)/ /若是更新要拋異常;
                        tx.commit();
                }遇上(HibernateException的E){
                        (TX = NULL){
                                tx.rollback();
                        }
                        / /返回false;
                        論壇主題貼();
                }
                返回true;
        }
    / **
     *查找符合HQL的全部數據
     * /
        市民同步列表<T>的findAll(絃樂HQL){
                屆會議DBUtil.getDBUtil()getSession();
                交易TX = NULL;
                名單<T>列表=新的ArrayList <T>();
                嘗試{
                        TX = session.beginTransaction();
                        列表= session.createQuery(HQL)名單();
                        session.flush();
                        tx.commit();
                }遇上(HibernateException的E){
                        (TX = NULL){
                                tx.rollback();
                        }
                        論壇主題貼();
                }
                返回列表;
        }
        
        / **
         *保存和跟新方法
         * /
        市民同步布爾saveOrUpdate(操實體){
                屆會議DBUtil.getDBUtil()getSession();
                交易TX = NULL;
                嘗試{
                        TX = session.beginTransaction();
                        session.saveOrUpdate(實體);
                        tx.commit();
                }遇上(HibernateException的E){
                        (TX = NULL){
                                tx.rollback();
                        }
                        / /返回false;
                        論壇主題貼();
                }
                返回true;
        }
}


基礎工廠採用單例實現獲取實例操做對象 
Java的代碼[IMG] http://www.javaeye.com/images/icon_copy.gif [/ IMG]
包edu.sasu.factory;   
  
導入edu.sasu.DAO.BaseDao;   
導入edu.sasu.DAOImpl.BaseDAOImpl;   
/ **  
*基礎工廠  
* @做者管理員  
*  
* @參數<T>  
* /  
公共類BaseFactory <T> {   
       
    私有靜態BaseFactory baseFactory; / /單一實例   
    私人BaseDao <T>訟;   
    的私人BaseFactory(){   
        實例=,新BaseDAOImpl <T>();     
    }   
       
    公共BaseDao <T>的getInstance(){/ /不要把工廠的新放在構造函數裏面,否則會出現遞歸錯誤   
        返回實例;   
    }   
       
    公共靜態BaseFactory getFactory(){   
        (baseFactory == NULL){   
            baseFactory =新BaseFactory();   
        }   
        返回baseFactory;   
    }   
}  

包edu.sasu.factory;

導入edu.sasu.DAO.BaseDao;
導入edu.sasu.DAOImpl.BaseDAOImpl;
/ **
*基礎工廠
* @做者管理員
*
* @參數<T>
* /
公共類BaseFactory <T> {
        
        私有靜態BaseFactory baseFactory; / /單一實例
        私人BaseDao <T>訟;
        的私人BaseFactory(){
                實例=,新BaseDAOImpl <T>();        
        }
        
        公共BaseDao <T>的getInstance(){/ /不要把工廠的新放在構造函數裏面,否則會出現遞歸錯誤
                返回實例;
        }
        
        公共靜態BaseFactory getFactory(){
                (baseFactory == NULL){
                        baseFactory =新BaseFactory();
                }
                返回baseFactory;
        }
}

以上定義baseDAO接口,baeDAOIMpl什麼接口的實現,baseFactory是工廠,對baseDAOimp實例化, 
在類中調用爲:用戶(一個POJO類) 
用戶實體=新用戶(); 
BaseFactory <USER>工廠BaseFactory.getFactory(); 
執行保存操做。factory.getInstance()保存(實體);實體用戶的實例對象 
執行保存操做,請你們評點下此種寫法有什麼很差的地方,本人能力有限,以爲還能夠,請大牛指教
幽默發表於2011年3月24日15時59

0 0請登陸後投票

superobin等級:初級會員 
[IMG] [/ IMG] http://www.javaeye.com/images/user-logo.gif?1299226978 
性別:[IMG] http://www.javaeye.com/images/icon_minigender_1.gif [/ IMG]


 /根據主鍵查詢


公共的對象findRel(類desClass,INT建立者標識){
會話的會話= NULL;
對象obj = NULL;
嘗試{
會議= HibernateUtil.getSession();
OBJ = session.get(desClass,新的整數(建立者標識));
}遇上(HibernateException的E){
論壇主題貼();
}最後{
HibernateUtil.closeSession(會議);
}
返回obj的;
}


Hibernate的條件查詢(標準查詢)

 
1,建立一個標準實例
net.sf.hibernate.Criteria這個接口表明對一個特定的持久化類的查詢。Session是用來製造Criteria實例的工廠。 

標準的暴擊= sess.createCriteria(Cat.class);/ /創建實力類能夠爲OBJECT.CLASS
crit.setMaxResults(50);
名單貓= crit.list();

返回最多50條記錄的結果集。

2,縮小結果集範圍
一個查詢條件(Criterion)是net.sf.hibernate.expression.Criterion接口的一個實例。類net.sf.hibernate.expression.Expression定義了得到一些內置的Criterion類型。 


進口org.hibernate.criterion.Projections ;/ /兩個查詢條件類
導入org.hibernate.criterion.Expression;

名單貓= sess.createCriteria(Cat.class)
    新增(Expression.like(「名稱」,「弗裏茨%」))
    。附加(Expression.between(「重量」,minWeight,maxWeight))
    名單();
表達式(表達式)能夠按照邏輯分組。 

名單貓= sess.createCriteria(Cat.class)
    新增(Expression.like(「名稱」,「弗裏茨%」))
    新增(Expression.or(
     expression.eq(「年齡」,新的整數(0)),
     Expression.isNull(「時代」)
    ))
    名單();

返回(名稱如「弗裏茨%」和年齡等於0或者年齡爲空)的結果集


名單貓= sess.createCriteria(Cat.class)
    附加(Expression.in(「名稱」,新的String [] {「弗裏茨」,「IZI」,「PK」}))
    新增(Expression.disjunction()
        附加(Expression.isNull(「年齡」))
     新增(Expression.eq(「年齡」,新的整數(0)))
     新增(Expression.eq(「年齡」,新的整數(1)))
     新增(Expression.eq(「年齡」,新的整數(2)))
    ))
    名單();

expression.disjunction()----意思什麼能夠按照邏輯分組
有不少預製的條件類型(Expression的子類)。有一個特別有用,可讓你直接嵌入SQL。 

名單貓= sess.createCriteria(Cat.class)
    新增(Expression.sql(「低像低($ alias.name)(?)」,「弗裏茨%」,Hibernate.STRING))
    名單();
其中的{化名}是一個佔位符,它將會被工程學系查詢實體的行別名工程學系替代。(原文:{alias}佔位符被查詢實體的行別名所取代) 

3,對結果排序
可使用net.sf.hibernate.expression.Order對結果調集排序。 

名單貓= sess.createCriteria(Cat.class)
    新增(Expression.like(「名稱」,「F%」)
    ,。addOrder(Order.asc(「名稱」))
    ,。addOrder(Order.desc(「年齡」))
    setMaxResults(50)
    名單();
4,關聯(協會)
你能夠在關聯之間使用createCriteria(),很容易地在存在關係的實體之間指定約束。 

名單貓= sess.createCriteria(Cat.class)
    新增(Expression.like(「名稱」,「F%」)
    個createCriteria(「小貓」。)
        新增(Expression.like(「名稱」,「F%」)
    名單();
注意,第二個createCriteria()返回一個Criteria的新實例,指向kittens集合類的元素。 

下面的替代形式在特定狀況下有用。 

名單貓= sess.createCriteria(Cat.class)
    。createAlias(「小貓」,「KT」)
    。createAlias(「龍虎鬥」,「山」)
    新增(Expression.eqProperty(「kt.name」,「mt.name」))
    名單();
(createAlias())並不會創建一個標準的新實例。) 

請注意,前面兩個查詢中Cat實例所持有的kittens集合類並無經過criteria預先過濾!若是你但願只返回知足條件的kittens,你必須使用returnMaps()。 

名單貓= sess.createCriteria(Cat.class)
    個createCriteria(「小貓」,「安靜」。)
        新增(Expression.eq(「名稱」,「F%」))
    ,。returnMaps()
    名單();
迭代ITER = cats.iterator();
而(iter.hasNext()){
    地圖=(地圖)iter.next「();
    貓貓(貓)map.get(Criteria.ROOT_ALIAS)的;
    貓小貓=(CAT)map.get(「KT」);
}
5,動態關聯對象獲取(動態關聯抓取)
能夠在運行時經過setFetchMode()來改變關聯對象自動獲取的策略。 

名單貓= sess.createCriteria(Cat.class)
    新增(Expression.like(「名稱」,「弗裏茨%」))
    (「龍虎鬥」。setFetchMode,FetchMode.EAGER)
    名單();
這個查詢會經過外鏈接(外鏈接)同時得到隊友和小貓。 

6,根據範例查詢(例如查詢)
net.sf.hibernate.expression.Example類容許你從指定的實例創造查詢條件。 

貓貓貓();
cat.setSex(「F」);
cat.setColor(Color.BLACK);
名單結果= session.createCriteria(Cat.class)
    新增(Example.create(CAT))
    名單();
版本屬性,表示符屬性和關聯都會被忽略。默認狀況下,null值的屬性也被排除在外。 

你能夠調整如何應用爲例。你能夠調整示例(範例)如何應用。 

例如例如= Example.create(CAT)
    。excludeZeroes()/ /排除零值的屬性
    。excludeProperty(「色」)/ /排除一個名爲「色」的屬性
    。IGNORECASE()/ /執行區分大小寫字符串比較
    enableLike(); / /使用相似字符串比較
名單結果= session.createCriteria(Cat.class)
    新增(例如)
    名單();
你甚至能夠用示例對關聯對象創建的標準。 

名單結果= session.createCriteria(Cat.class)
    新增(Example.create(CAT))
    個createCriteria(「伴侶」。)
        新增(Example.create(cat.getMate()))
    名單();









 
的HQL的多表查詢:
對象之間老是有各類各樣的關係,關聯關係是類之間最多見的關係。多表查詢是HQL中的強大功能之一,
包括內鏈接、左鏈接和右鏈接等。多表查詢的設置及運行都比較麻煩,在運行本節中的示例時,
務必保證每一步都沒有錯誤。
一:表之間的關聯關係:
在數據庫joblog中用到了3個表:student(學生表)、course(課程表)和sc(選課表)。在現實模型中,
一個學生能夠選擇多門課程,一個課程能夠被多個學生選擇,student和course是多對多的關聯關係。
爲了便於演示的HQL的多表查詢,本顯示細大全 - 宜配網假設學生和課程之間什麼單向關聯關係。
在多對多的關聯關係中,通常來講有個中間表,這個表描述了多對多關係,這就是選課表sc,
SC每一行數據表明一個學生的選課和成績。
各個表的主鍵:外鍵設定以下。
學生表的的主鍵什麼的ID字段。
課程表的的主鍵什麼的ID字段。
SC表的的主鍵是ID字段。
SC表中的斯諾字段是學生表的ID字段的:外鍵。
SC表中的CNO字段是課程表的ID字段的:外鍵。
在MySQL的查詢瀏覽器中設定好上述關係。若是此處設定不正確,可能會影響多表鏈接處查詢。
其中SC表的建表信息以下(其中弱者受制與了:外鍵關係)。
建立表「joblog」。「SC」(
'ID'INT(10)無符號的NOT NULL AUTO_INCREMENT的意見'身份證',
「斯諾」INT(10)無符號NOT NULL DEFAULT '0'評論'學號',
「CNO」INT(10)無符號NOT NULL DEFAULT '0'評論'課程號「,
「一級」的詮釋(10)無符號默認爲NULL評論「成績」,
的PRIMARY KEY(「ID」),
鍵'FK_sc_1「(」斯諾「),
關鍵'FK_sc_2「(CNO)
約束'FK_sc_1的外鍵(「斯諾」)參考「學生」(「ID」),/ *:外鍵信息* /
約束'FK_sc_2的FOREIGN KEY(CNO')參考'固然'('ID')/ *:外鍵信息* /
)ENGINE = InnoDB的默認的CHARSET = GB2312;
二:表中的數據:
這一顯示細中用到了3個表的數據
三:修改持久化類:
Student對象和Course對象之間是多對多的關係。此處使用的是單向關聯,僅僅創建從Student到Course的單向關聯。
僅有學生到課的單向關聯。
爲了創建Student到Course的單向關聯關係,在Student.java中新加一個屬性course。course屬性是Set型的,
能夠在這個屬性中加入多個Course對象,創建起關聯關係。下面是加入course屬性後的源代碼,粗體部分爲加入的代碼。
包hibernate.ch06;
進口java.util.HashSet;
進口java.util.Set;
公共類學生實現了java.io.Serializable {
        私人整數ID; / /編號
        私人整數SNO / /學號
        私人字符串SNAME / /姓名;
        私人字符串ssex; / /性別
        私人的字符串sdept; / /系部
        私人整數聖人; / /年齡
        私人的字符串saddress; / /住址
       私定課程=新的HashSet(); / /所選課程
       市民學生(){
}
/ /此處省略其餘的構造方法擴展功能

/ /此處省略getter / setter方法訪問器
/ /課程屬性的獲取訪問器
   公共的集getCourse(){
        返回過程;
   }
   / /課程屬性的集合訪問器
   「無效setCourse(課程設置){
          this.course =課程;
   }
}
持久化類Course.java和SC.java無需修改
 
在映射文件中加入關聯信息:
在Student.hbm.xml映射配置文件中,加入Student到Course的映射信息。具體代碼以下。
        <set name="course" table="sc" lazy="false" cascade="save-update">
         <key column="sno"
         <many-to-many class="hibernate.ch06.Course" column="cno" />
        </集>
說明以下。
     <set>元素是和<class>元素平行的元素。<set>元素代表將要映射的字段對應着一個集合。<set>元素包含多個屬性,
其中:name屬性用於設置映射的持久化類的屬性名稱,在本例中爲Student表的course屬性;table屬性表示
多對多關聯關係的中間表名稱,此處爲sc表;cascade表示當保存或者更新Student實例時,是否保存或更新Course對象。
     <SET>元素的子元素<key column="sno" />設定與學生表關聯的中間表SC的:外鍵SNO。
     <set>元素的子元素<many-to-many>用於設定多對多關係。在該元素中,class屬性用於設定多對多關係中,
與學生類關聯的類課程類;列屬性設定中間表相關的例句課程表鏈接處的:外鍵CNO。
完整的配置文件Student.hbm.xml以下所示。
<?XML版本=「1.0」?>
<的DOCTYPE Hibernate的映射公安!「 - / /休眠/ Hibernate映射的DTD 3.0 / / EN」
「http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd~~V」>
<hibernate-mapping>
      <class name="hibernate.ch06.Student" table="student" catalog="joblog">
           <ID name="id" type="integer">
                 <列name="id" />
                 <generator class="identity"> </發電機>
           </ ID>
           <! - 映射學號 - >
           <property name="sno" type="integer">
                 <列name="Sno" not-null="true"
           </財產>
           <! - 映射姓名 - >
           <property name="sname" type="string">
                <列name="Sname" length="45"
           </財產>
           <! - 映射系部 - >
           <property name="sdept" type="string">
                <列name="Sdept" length="10"
           </財產>
         <! - 映射年齡 - >
           <property name="sage" type="integer">
                <列name="Sage" />
           </財產>
           <! - 映射性別 - >
           <property name="ssex" type="string">
                <列name="Ssex" length="2"
           </財產>
           <! - 映射住址 - >
           <property name="saddress" type="string">
                <列name="Saddress" length="45"
           </財產>
          <! - 聯接 - >
           <set name="course" table="sc" lazy="false" cascade="save-update">
               <key column="sno"
               <many-to-many class="hibernate.ch06.Course" column="cno" < - 多對多 - >
           </集>
       </類>
</休眠映射>
五:左外鏈接:
左外鏈接(左外鏈接)查詢出左表對應的複合條件的全部記錄,如查詢張三同窗的選課信息。
下面是類HQLLeftOuterJoinQuery的源代碼。
包hibernate.ch06;
進口hibernate.HibernateSessionFactory;
導入java.util.Iterator的;
進口的java.util.List;
導入org.hibernate.Query;
導入org.hibernate.Session;
公共類HQLLeftOuterJoinQuery的{
       公共靜態無效的主要(字串[] args){
             會話的會話= HibernateSessionFactory.currentSession();
            / /的HQL查詢語句
            字符串HQL =「從學生的左加入s.courseçs.sname ='張三'」;
             查詢的查詢= session.createQuery(HQL)/ /建立查詢;
             的名單= query.list(); / /執行查詢
             迭代它= list.iterator();
             而(it.hasNext()){
                   Object []的OBJ =(對象[])it.next();
                   學生STU = obj的(學生)[0];
                   固然固然=(課程)obj的[1];
                  (「*********學生信息及其選課信息******************」);
                   (course! = NULL){
                    system.out.println(stu.getSno()「\ t」的stu.getSname()「\ T」 
                                「課程:」course.getCname());
                    }不然{
                          system.out.println(stu.getSno()「\ t」的stu.getSname()「\」);
                    };
             }
       }
}
若是隻用單表查詢,只能從student表中查詢出張三的我的信息,而沒法知道她的選課信息,由於選課信息存儲在中間表sc中。
的HQL語句從學生小號左加入s.courseçs.sname ='張山'檢索出了長三的選課信息。
     在的HQL中使用左外鏈接關鍵字進行左:外鏈接處,外關鍵字能夠省略。
     s.course是Student對象中的一個屬性,用來存儲Student對象的選課信息。在執行查詢時,將根據Student.hbm.xml中的
配置生成SQL語句,並檢索信息。
     查詢的結果返回一個Object[]數組,數組的第0個元素是Student對象,第1個元素是與Object[0]中對應的學生所選課的Course對象。
HQLLeftOuterJoinQuery類在執行過程當中產生的左:外鏈接處的的SQL語句以下。
冬眠:
    選擇
          id1_0_ student0_.id
          id4_1_ course2_.id
          student0_.Sno做爲Sno1_0_
          student0_.Sname做爲Sname1_0_
          student0_.Sdept做爲Sdept1_0_
          student0_.Sage做爲Sage1_0_
         student0_.Ssex做爲Ssex1_0_
         student0_.Saddress做爲Saddress1_0_
          course2_.Cno做爲Cno4_1_
          course2_.Cname做爲Cname4_1_
          course2_.Ccredit做爲Ccredit4_1_
    從
          joblog.student student0_
    左外鏈接
        SC course1_
               在student0_.id = course1_.sno
   左外鏈接
        joblog.course course2_
               在course1_.cno = course2_.id
   哪裏
        student0_.Sname ='張三'
冬眠:
    選擇
          course0_.sno做爲sno1_
          course0_.cno做爲cno1_
          id4_0_ course1_.id
          course1_.Cno做爲Cno4_0_
          course1_.Cname做爲Cname4_0_
          course1_.Ccredit做爲Ccredit4_0_
    從
          SC course0_
左外鏈接
        joblog.course course1_
                在course0_.cno = course1_.id
    哪裏
        course0_.sno =?
使用以下語句將只返回學生對象。
從學生的左加入s.course C,其中s.sname ='張三'選擇小號
以下是隻返回學生對象的部分代碼。
        會話的會話= HibernateSessionFactory.currentSession();      
       / /的HQL查詢語句
        字符串HQL =「選擇S從學生小號左加入s.courseçs.sname ='張三'」;
        查詢的查詢= session.createQuery(HQL)/ /建立查詢;       
        的名單= query.list(); / /執行查詢    
        迭代它= list.iterator();       
        而(it.hasNext()){
               學生STU(學生)it.next「,();
              (「*********學生信息及其選課信息******************」);
               system.out.println(stu.getSno()「\ t」的stu.getSname()「\」);
        }
六:左外抓取鏈接:
左外抓取鏈接指定在Hibernate檢索數據時,採用抓取的方式,直接將數據加載到與Student對象關聯的course屬性中。
下面是左外抓取鏈接的程序。
        / /的HQL查詢語句
        字符串HQL =「選擇S從學生的左join fetch的s.courseçs.sname ='張三'」;
        查詢的查詢= session.createQuery(HQL)/ /建立查詢;       
        的名單= query.list(); / /執行查詢       
        迭代它= list.iterator();
        而(it.hasNext()){
                學生STU(學生)it.next「,();
               (「*********學生信息及其選課信息******************」);
               system.out.println(stu.getSno()「\ t」的stu.getSname()「\」);
        }
     左:外抓取鏈接處使用左join fetch的關鍵字。
與左外鏈接不一樣的是:左外抓取鏈接query.list()返回的集合中存放Student對象的引用,
與之相關聯的選課信息存放在課程屬性大全 - 宜配網。
七:右外鏈接:
HQL的大全 - 宜配網使用關鍵字右外部聯接售後服務:外鏈接處,外關鍵字能夠省略。售後服務:外鏈接處相關的例句左:外鏈接處相似,再也不贅述。
八:內鏈接:
內鏈接(內蒙古
HQL的大全 - 宜配網使用關鍵字內部聯接進行內鏈接處,下面什麼使用內鏈接處的程序。
        會話的會話= HibernateSessionFactory.currentSession()/ /建立會議      
        HQL =字符串「從學生小號內加入s.course C」/ /的HQL查詢語句
        查詢的查詢= session.createQuery(HQL)/ /建立查詢;
        的名單= query.list(); / /執行查詢       
        迭代它= list.iterator();            
        而(it.hasNext()){
                Object []的OBJ =(對象[])it.next();
                學生STU = obj的(學生)[0];
                固然固然=(課程)obj的[1];
               (「*********學生信息及其選課信息******************」);
                system.out.println(stu.getSno()「\ t」的stu.getSname()「\ t」的「課程:」的固然getCname());
        }
     HQL的大全 - 宜配網使用內
     可使用選擇S從學生的內在聯接s.courseç只返回學生對象。
九:抓取內鏈接:
抓取內鏈接與內鏈接不一樣之處在於其對象的內存狀態不同。的HQL中使用內部聯接取進行抓取內鏈接處,以下程序,所示。
        會話的會話HibernateSessionFactory.currentSession =()/ /建立會議      
        HQL =「選擇S從學生的內在join fetch的s.courseç」/ /的HQL語句
        查詢的查詢= session.createQuery(HQL)/ /建立查詢;       
        的名單= query.list(); / /執行查詢       
        迭代它= list.iterator();      
        而(it.hasNext()){
        學生STU(學生)it.next「,();
        (「*********學生信息及其選課信息******************」);
        system.out.println(stu.getSno()「\ t」的stu.getSname()「\」);
    }
     內抓取鏈接處使用內部聯接fech關鍵字。
     它與內鏈接的區別是返回檢索的list中存放的是Student對象的引用,與之相關聯的選課信息存放在course屬性中
相關文章
相關標籤/搜索