waterye

          Hibernate的查詢方式

          小結Hibernate的查詢方式

          1. get() and load()
          session.get(Clazz, id);
          session.load(Clazz, id);

          說明: load()與get()的區別
          請注意如果沒有匹配的數據庫記錄,load()方法可能拋出無法恢復的異常(unrecoverable exception)。 如果類的映射使用了代理(proxy),load()方法會返回一個未初始化的代理,直到你調用該代理的某方法時才會去訪問數據庫。 若你希望在某對象中創建一個指向另一個對象的關聯,又不想在從數據庫中裝載該對象時同時裝載相關聯的那個對象,那么這種操作方式就用得上的了。 如果為相應類映射關系設置了batch-size, 那么使用這種操作方式允許多個對象被一批裝載(因為返回的是代理,無需從數據庫中抓取所有對象的數據)。

          如果你不確定是否有匹配的行存在,應該使用get()方法,它會立刻訪問數據庫,如果沒有對應的行,會返回null

          2. HQL

          // 返回一行記錄
          String hql = "from TOrder o where o.id = ?";
          TOrder o 
          = (TOrder) s.createQuery(hql)
                  .setParameter(
          0, orderId)
                  .uniqueResult();

          // 命名參數
          Query q = sess.createQuery("from DomesticCat cat where cat.name = :name");
          q.setString(
          "name""Fritz");

          // 位置參數
          Query q = sess.createQuery("from DomesticCat cat where cat.name = ?");
          q.setString(
          0"Izi");

          // 命名參數列表
          Query q = sess.createQuery("from DomesticCat cat where cat.name in (:namesList)");
          q.setParameterList(
          "namesList", names);

          // 分頁查詢 
          Query q = sess.createQuery("from DomesticCat cat");
          q.setFirstResult(
          20);
          q.setMaxResults(
          10);
          List cats 
          = q.list();


          3. Criteria

          List list = s.createCriteria(Enrolment.class)
                      .createAlias(
          "student""s")
                      .createAlias(
          "course""c")
                      .add( Restrictions.isNotEmpty(
          "s.enrolments") )
                      .setProjection( Projections.projectionList()
                              .add( Projections.property(
          "s.name") )
                              .add( Projections.property(
          "c.description") )
                      )
                      .setCacheable(
          true)
                      .list();


          4. Native SQL

          String treeSql = "" +
                          
          "select {t.*}, level from tree t " +
                          
          " start with t.parent_id = 0 " +
                          
          " connect by prior t.id = t.parent_id";

          List result 
          = session.createSQLQuery(treeSql)
              .addEntity(
          "t", Tree.class)
              .addScalar(
          "level", Hibernate.INTEGER)
              .list();

          5. Named SQL queries(不推薦)

          6. filter(不推薦)

          7. Detached queries(還沒測試)
          The DetachedCriteria class lets you create a query outside the scope of a session, and then later execute it using some arbitrary Session

          參考
          1. Hibernate Reference Documentation
          2. Hibernate test case

          posted on 2005-08-29 16:34 waterye 閱讀(4129) 評論(3)  編輯  收藏 所屬分類: hibernate

          Feedback

          # re: Hibernate的查詢方式 2005-08-30 19:13 David

          有否left join /right join 之類的?  回復  更多評論   

          # re: Hibernate的查詢方式 2005-08-30 21:16 Water Ye@ITO

          demo:
          select cust
          from Product prod,
          Store store
          inner join store.customers cust
          where prod.name = 'widget'
          and store.location.name in ( 'Melbourne', 'Sydney' )
          and prod = all elements(cust.currentOrder.lineItems)  回復  更多評論   

          # re: Hibernate的查詢方式 2005-08-30 21:19 Water Ye@ITO

          left join: from Cat as cat left join cat.mate.kittens as kittens
          full join: from Formula form full join form.parameter param  回復  更多評論   

          主站蜘蛛池模板: 湘乡市| 公安县| 孝感市| 兴安盟| 福海县| 婺源县| 昭觉县| 云龙县| 雅江县| 永胜县| 平塘县| 剑阁县| 长宁县| 宁远县| 东平县| 大庆市| 霍山县| 房产| 禄劝| 军事| 合山市| 呼玛县| 疏勒县| 吴川市| 桃园县| 美姑县| 武汉市| 板桥市| 滕州市| 华亭县| 化德县| 太康县| 那曲县| 乌拉特中旗| 佛山市| 施秉县| 科技| 乌兰察布市| 唐河县| 兴仁县| 太白县|