hibernate中的5種檢索方式

1.1、導航對象圖檢索方式  

          根據已經加載的對象導航到其他對象

          例如:在前面的各種映射關係中,實體類包含對其他類對象的引用。

              Dept d = (Dept) session.get(Dept.class,2);

              d.getStaffSet().size();  //d對象關聯Staff集合,hibernate會自動檢索Staff數據。如何檢索的,看下面圖中發送的sql語句。




1.2、OID檢索方式

          按照對象的OID來檢索對象

                                       依賴Session接口
                                      主要是:load()/get()的用法


1.3、HQL檢索方式

          HQL:Hibernate Query Language ,是面向對象的查詢語言,它和SQL查詢語言有些相似,在Hibernate提供的各種檢索方式中,HQL是使用的最廣的一種檢索方式,

              注意:HQL操作的全是POJO類中的屬性,而不是操作數據庫表中的字段。

1.4、QBC檢索方式

          QBC:Query By Criteria,是一種更加面向對象的查詢語言,提供的一系列QBC API來檢索對象。

          HQL所能做的事情,使用QBC也大多能做用,這個通過實例來看看QBC是如何使用的。  

            步驟:

             1>獲得session

             2>session.createCriteria(Obejct.class); 創建criteria對象

             3>使用criteria的API方法進行條件的增加。add(Restrictions.eq(屬性名,值))

             4>執行查詢

                  list():返回一個集合列表,有可能集合中裝的是數組,有可能是POJO對象。

                  uniqueResult():返回一個查詢結果,在已知查詢結果只有一個或者0個時,使用是沒有問題的,如果返回結果有多個,那麼就會報異常

          例子一:使用QBC來對Staff進行查詢

//使用QBC,更加面向對象,不用寫sql語句。要查詢什麼,就直接將其類.class當作參數就能查詢出來
        Criteria QBCCriteria = session.createCriteria(Staff.class);
        List<Staff> staffList = QBCCriteria.list();
        for(Staff staff : staffList){
            System.out.println(staff.toString());
        }
//結果
    Hibernate: 
    select
        this_.id as id1_0_,
        this_.name as name1_0_,
        this_.deptId as deptId1_0_ 
    from
        staff this_
Staff [id=2, name=qqq1]
Staff [id=3, name=qqq2]
Staff [id=4, name=qqq3]
Staff [id=5, name=qqq4]
Staff [id=6, name=qqq5]
Staff [id=7, name=qqq6]
Staff [id=8, name=qqq7]
Staff [id=9, name=qqq8]
Staff [id=10, name=qqq9]

例子二:使用QBC來對Staff進行條件查詢

//使用QBC,對Staff進行查詢
        Criteria QBCCriteria = session.createCriteria(Staff.class);
        //add()添加條件,通過Restrictions(字段名,值),由於確定是1行記錄,所以直接用uniqueResult()
        Staff staff = (Staff) QBCCriteria.add(Restrictions.eq("id",3)).uniqueResult();

        System.out.println(staff.toString());

//結果
Hibernate: 
    select
        this_.id as id1_0_,
        this_.name as name1_0_,
        this_.deptId as deptId1_0_ 
    from
        staff this_ 
    where
        this_.id=?
Staff [id=3, name=qqq2]

例子三:QBC也能進行連接查詢


// from Staff inner join dept d ON 後面是hibernate自動幫我們填寫;
        Criteria criteria = session.createCriteria(Staff.class);
        //createAlias默認是內連接,可以不用寫。可以爲dept表取別名,也可以不取。
        criteria.createAlias("dept", "d", Criteria.INNER_JOIN);
        List list = criteria.list();
        System.out.println(list);

//結果
Hibernate: 
    select
        this_.id as id1_1_,
        this_.name as name1_1_,
        this_.deptId as deptId1_1_,
        d1_.id as id0_0_,
        d1_.name as name0_0_ 
    from
        staff this_ 
    inner join
        dept d1_ 
            on this_.deptId=d1_.id
[oneToMany.Staff@6a155d66, oneToMany.Staff@55a7e5ae, oneToMany.Staff@1d82e71, oneToMany.Staff@17d0fda9, oneToMany.Staff@19bd6e76, oneToMany.Staff@639f122d, oneToMany.Staff@60627b73, oneToMany.Staff@6196ec74, oneToMany.Staff@7b7de5b9]

給一張表來看看qbc增加的條件查詢語句。



重點有一個離線Criteria對象的用法。

            1、在web層封裝查詢條件到離線Criteria對象中,將其DetachedCriteria對象綁定到Thread上。

            2、到dao層,就能通過Thread拿到該離線Criteria對象,然後創建session。將session給DetachedCriteria,就能夠執行查詢

            代碼:

             WEB層

              DetachedCriteria detachedCriteria =DetachedCriteria.forClass(Customer.class);

              detachedCriteria.add(Restrictions.eq("name", "kitty"));

 

             DAO層

              Session session = HibernateUtils.openSession();

                   Transaction transaction = session.beginTransaction();

 

                   // 將離線查詢對象 關聯到Session

                   Criteria criteria = detachedCriteria.getExecutableCriteria(session);

                   Customer customer = (Customer) criteria.uniqueResult();

                

 

     

      1.5、本地SQL檢索方式

          使用標準的SQL語句來編寫。

          步驟:

            1>獲得session

            2>編寫sql語句

            3>session.createSQLQuery(sql);獲取SQLQuey對象

            4>給sql語句設置參數。

            5>執行查詢

                  list():返回一個集合列表,集合中裝的是Object[]。

                  返回實體類對象集合,如果與實體類進行了綁定,也就是使用了addEntity(xxx.class)。


二、總結

      以上就是我們說的5種檢索,其中說的重點就是hql的用法,上面的例子全部寫完了差不多就對hql有一定的瞭解。記住hql是對pojo類進行操作,而不是對數據庫中的表。在使用連接查詢時,可以使用QBC,因爲更簡單,只需要用createAlias()就能使用任何的連接。一般在開發中sql語句都會提取出來放到hbm中,例如

      

        在hbm映射文件 (也可以用註解配置)

                 <!-- 這裏可以定義命名查詢 -->

                 <!--        定義 HQL 語句 <query name=""></query> -->

                 <!--        定義 SQL 語句 <sql-query name=""></sql-query> -->

                 <query name="findCustomerByName">

                        <![CDATA[from Customer where name = ?]]>

                 </query>

            * 爲hql語句 起了一個名字

 

        程序代碼:

            //相當於把sql語句分離開來了。方便維護

            Query query = session.getNamedQuery("findCustomerByName");

                 query.setParameter(0, "tom");

                 Customer customer = (Customer) query.uniqueResult();



發佈了32 篇原創文章 · 獲贊 11 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章