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  回復  更多評論   

          主站蜘蛛池模板: 肥东县| 大关县| 南岸区| 海淀区| 白水县| 海宁市| 浦江县| 饶平县| 三门峡市| 福清市| 云林县| 永定县| 威海市| 柘荣县| 通山县| 南昌县| 东乌珠穆沁旗| 临猗县| 阳原县| 泗阳县| 白城市| 石台县| 塘沽区| 温泉县| 福泉市| 淳化县| 黎平县| 永安市| 西林县| 怀安县| 利辛县| 措美县| 辉南县| 凤山县| 策勒县| 东辽县| 乌拉特前旗| 泸溪县| 民乐县| 水城县| 马公市|