posts - 122,  comments - 25,  trackbacks - 0
          http://docs.huihoo.com/framework/hibernate/reference-v3_zh-cn/querycriteria.html

          第 16 章  條件查詢(Criteria Queries)

          具有一個直觀的、可擴展的條件查詢API是Hibernate的特色。

          16.1. 創(chuàng)建一個Criteria 實例

          org.hibernate.Criteria接口表示特定持久類的一個查詢。Session是 Criteria實例的工廠。

          Criteria crit = sess.createCriteria(Cat.class);
          crit.setMaxResults(
          50);
          List cats 
          = crit.list();


          16.2. 限制結(jié)果集內(nèi)容

          一個單獨的查詢條件是org.hibernate.criterion.Criterion 接口的一個實例。org.hibernate.criterion.Restrictions類 定義了獲得某些內(nèi)置Criterion類型的工廠方法。

          List cats = sess.createCriteria(Cat.class)
              .add( Restrictions.like(
          "name""Fritz%") )
              .add( Restrictions.between(
          "weight", minWeight, maxWeight) )
              .list();


          約束可以按邏輯分組。

          List cats = sess.createCriteria(Cat.class)
              .add( Restrictions.like(
          "name""Fritz%") )
              .add( Restrictions.or(
                  Restrictions.eq( 
          "age"new Integer(0) ),
                  Restrictions.isNull(
          "age")
              ) )
              .list();


          List cats = sess.createCriteria(Cat.class)
              .add( Restrictions.in( 
          "name"new String[] { "Fritz""Izi""Pk" } ) )
              .add( Restrictions.disjunction()
                  .add( Restrictions.isNull(
          "age") )
                  .add( Restrictions.eq(
          "age"new Integer(0) ) )
                  .add( Restrictions.eq(
          "age"new Integer(1) ) )
                  .add( Restrictions.eq(
          "age"new Integer(2) ) )
              ) )
              .list();


          Hibernate提供了相當(dāng)多的內(nèi)置criterion類型(Restrictions 子類), 但是尤其有用的是可以允許你直接使用SQL。

          List cats = sess.createCriteria(Cat.class)
              .add( Restrictions.sql(
          "lower({alias}.name) like lower(?)""Fritz%", Hibernate.STRING) )
              .list();


          {alias}占位符應(yīng)當(dāng)被替換為被查詢實體的列別名。

          Property實例是獲得一個條件的另外一種途徑。你可以通過調(diào)用Property.forName() 創(chuàng)建一個Property。

          Property age = Property.forName("age");
          List cats 
          = sess.createCriteria(Cat.class)
              .add( Restrictions.disjunction()
                  .add( age.isNull() )
                  .add( age.eq( 
          new Integer(0) ) )
                  .add( age.eq( 
          new Integer(1) ) )
                  .add( age.eq( 
          new Integer(2) ) )
              ) )
              .add( Property.forName(
          "name").in( new String[] { "Fritz""Izi""Pk" } ) )
              .list();


          16.3. 結(jié)果集排序

          你可以使用org.hibernate.criterion.Order來為查詢結(jié)果排序。

          List cats = sess.createCriteria(Cat.class)
              .add( Restrictions.like(
          "name""F%")
              .addOrder( Order.asc(
          "name") )
              .addOrder( Order.desc(
          "age") )
              .setMaxResults(
          50)
              .list();

          List cats = sess.createCriteria(Cat.class)
              .add( Property.forName(
          "name").like("F%") )
              .addOrder( Property.forName(
          "name").asc() )
              .addOrder( Property.forName(
          "age").desc() )
              .setMaxResults(
          50)
              .list();


          16.4. 關(guān)聯(lián)

          你可以使用createCriteria()非常容易的在互相關(guān)聯(lián)的實體間建立 約束。

          List cats = sess.createCriteria(Cat.class)
              .add( Restrictions.like(
          "name""F%")
              .createCriteria(
          "kittens")
                  .add( Restrictions.like(
          "name""F%")
              .list();


          注意第二個 createCriteria()返回一個新的 Criteria實例,該實例引用kittens 集合中的元素。

          接下來,替換形態(tài)在某些情況下也是很有用的。

          List cats = sess.createCriteria(Cat.class)
              .createAlias(
          "kittens""kt")
              .createAlias(
          "mate""mt")
              .add( Restrictions.eqProperty(
          "kt.name""mt.name") )
              .list();


          (createAlias()并不創(chuàng)建一個新的 Criteria實例。)

          Cat實例所保存的之前兩次查詢所返回的kittens集合是 沒有被條件預(yù)過濾的。如果你希望只獲得符合條件的kittens, 你必須使用returnMaps()。

          List cats = sess.createCriteria(Cat.class)
              .createCriteria(
          "kittens""kt")
                  .add( Restrictions.eq(
          "name""F%") )
              .returnMaps()
              .list();
          Iterator iter 
          = cats.iterator();
          while ( iter.hasNext() ) {
              Map map 
          = (Map) iter.next();
              Cat cat 
          = (Cat) map.get(Criteria.ROOT_ALIAS);
              Cat kitten 
          = (Cat) map.get("kt");
          }


          16.5. 動態(tài)關(guān)聯(lián)抓取

          你可以使用setFetchMode()在運行時定義動態(tài)關(guān)聯(lián)抓取的語義。

          List cats = sess.createCriteria(Cat.class)
              .add( Restrictions.like(
          "name""Fritz%") )
              .setFetchMode(
          "mate", FetchMode.EAGER)
              .setFetchMode(
          "kittens", FetchMode.EAGER)
              .list();


          這個查詢可以通過外連接抓取mate和kittens。 查看第 20.1 節(jié) “ 抓取策略(Fetching strategies) ”可以獲得更多信息。
          16.6. 查詢示例

          org.hibernate.criterion.Example類允許你通過一個給定實例 構(gòu)建一個條件查詢。

          Cat cat = new Cat();
          cat.setSex(
          'F');
          cat.setColor(Color.BLACK);
          List results 
          = session.createCriteria(Cat.class)
              .add( Example.create(cat) )
              .list();


          版本屬性、標(biāo)識符和關(guān)聯(lián)被忽略。默認(rèn)情況下值為null的屬性將被排除。

          你可以自行調(diào)整Example使之更實用。

          Example example = Example.create(cat)
              .excludeZeroes()           
          //exclude zero valued properties
              .excludeProperty("color")  //exclude the property named "color"
              .ignoreCase()              //perform case insensitive string comparisons
              .enableLike();             //use like for string comparisons
          List results = session.createCriteria(Cat.class)
              .add(example)
              .list();


          你甚至可以使用examples在關(guān)聯(lián)對象上放置條件。

          List results = session.createCriteria(Cat.class)
              .add( Example.create(cat) )
              .createCriteria(
          "mate")
                  .add( Example.create( cat.getMate() ) )
              .list();


          16.7. 投影(Projections)、聚合(aggregation)和分組(grouping)

          org.hibernate.criterion.Projections是 Projection 的實例工廠。我們通過調(diào)用 setProjection()應(yīng)用投影到一個查詢。

          List results = session.createCriteria(Cat.class)
              .setProjection( Projections.rowCount() )
              .add( Restrictions.eq(
          "color", Color.BLACK) )
              .list();

          List results 
          = session.createCriteria(Cat.class)
              .setProjection( Projections.projectionList()
                  .add( Projections.rowCount() )
                  .add( Projections.avg(
          "weight") )
                  .add( Projections.max(
          "weight") )
                  .add( Projections.groupProperty(
          "color") )
              )
              .list();


          在一個條件查詢中沒有必要顯式的使用 "group by" 。某些投影類型就是被定義為 分組投影,他們也出現(xiàn)在SQL的group by子句中。

          你可以選擇把一個別名指派給一個投影,這樣可以使投影值被約束或排序所引用。下面是兩種不同的實現(xiàn)方式:

          List results = session.createCriteria(Cat.class)
              .setProjection( Projections.alias( Projections.groupProperty(
          "color"), "colr" ) )
              .addOrder( Order.asc(
          "colr") )
              .list();

          List results 
          = session.createCriteria(Cat.class)
              .setProjection( Projections.groupProperty(
          "color").as("colr") )
              .addOrder( Order.asc(
          "colr") )
              .list();


          alias()和as()方法簡便的將一個投影實例包裝到另外一個 別名的Projection實例中。簡而言之,當(dāng)你添加一個投影到一個投影列表中時 你可以為它指定一個別名:

          List results = session.createCriteria(Cat.class)
              .setProjection( Projections.projectionList()
                  .add( Projections.rowCount(), 
          "catCountByColor" )
                  .add( Projections.avg(
          "weight"), "avgWeight" )
                  .add( Projections.max(
          "weight"), "maxWeight" )
                  .add( Projections.groupProperty(
          "color"), "color" )
              )
              .addOrder( Order.desc(
          "catCountByColor") )
              .addOrder( Order.desc(
          "avgWeight") )
              .list();

          List results 
          = session.createCriteria(Domestic.class"cat")
              .createAlias(
          "kittens""kit")
              .setProjection( Projections.projectionList()
                  .add( Projections.property(
          "cat.name"), "catName" )
                  .add( Projections.property(
          "kit.name"), "kitName" )
              )
              .addOrder( Order.asc(
          "catName") )
              .addOrder( Order.asc(
          "kitName") )
              .list();


          你也可以使用Property.forName()來表示投影:

          List results = session.createCriteria(Cat.class)
              .setProjection( Property.forName(
          "name") )
              .add( Property.forName(
          "color").eq(Color.BLACK) )
              .list();

          List results 
          = session.createCriteria(Cat.class)
              .setProjection( Projections.projectionList()
                  .add( Projections.rowCount().as(
          "catCountByColor") )
                  .add( Property.forName(
          "weight").avg().as("avgWeight") )
                  .add( Property.forName(
          "weight").max().as("maxWeight") )
                  .add( Property.forName(
          "color").group().as("color" )
              )
              .addOrder( Order.desc(
          "catCountByColor") )
              .addOrder( Order.desc(
          "avgWeight") )
              .list();


          16.8. 離線(detached)查詢和子查詢

          DetachedCriteria類使你在一個session范圍之外創(chuàng)建一個查詢,并且可以使用任意的 Session來執(zhí)行它。

          DetachedCriteria query = DetachedCriteria.forClass(Cat.class)
              .add( Property.forName(
          "sex").eq('F') );
             
          Session session 
          = .;
          Transaction txn 
          = session.beginTransaction();
          List results 
          = query.getExecutableCriteria(session).setMaxResults(100).list();
          txn.commit();
          session.close();


          DetachedCriteria也可以用以表示子查詢。條件實例包含子查詢可以通過 Subqueries或者Property獲得。

          DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)
              .setProjection( Property.forName(
          "weight").avg() );
          session.createCriteria(Cat.
          class)
              .add( Property.forName(
          "weight).gt(avgWeight) )
              .list();

          DetachedCriteria weights 
          = DetachedCriteria.forClass(Cat.class)
              .setProjection( Property.forName(
          "weight") );
          session.createCriteria(Cat.
          class)
              .add( Subqueries.geAll(
          "weight", weights) )
              .list();


          甚至相互關(guān)聯(lián)的子查詢也是有可能的:

          DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class"cat2")
              .setProjection( Property.forName(
          "weight").avg() )
              .add( Property.forName(
          "cat2.sex").eqProperty("cat.sex") );
          session.createCriteria(Cat.
          class"cat")
              .add( Property.forName(
          "weight).gt(avgWeightForSex) )
              .list();

          posted on 2007-05-15 08:55 josson 閱讀(368) 評論(0)  編輯  收藏 所屬分類: Hibernate

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          <2007年5月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          收藏夾

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 屏山县| 尉犁县| 东乌| 长岛县| 扶余县| 秦安县| 辽源市| 那曲县| 鄂伦春自治旗| 高淳县| 禹州市| 武乡县| 定襄县| 柏乡县| 张家口市| 凤山市| 华池县| 祁东县| 东安县| 庄河市| 奇台县| 沙洋县| 通道| 剑阁县| 长垣县| 武夷山市| 阿坝| 长泰县| 高雄县| 漳浦县| 冕宁县| 衢州市| 绥阳县| 井陉县| 齐河县| 平塘县| 夹江县| 霸州市| 景宁| 屏东市| 永靖县|