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

          第 16 章  條件查詢(Criteria Queries)

          具有一個(gè)直觀的、可擴(kuò)展的條件查詢API是Hibernate的特色。

          16.1. 創(chuàng)建一個(gè)Criteria 實(shí)例

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

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


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

          一個(gè)單獨(dú)的查詢條件是org.hibernate.criterion.Criterion 接口的一個(gè)實(shí)例。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)被替換為被查詢實(shí)體的列別名。

          Property實(shí)例是獲得一個(gè)條件的另外一種途徑。你可以通過調(diào)用Property.forName() 創(chuàng)建一個(gè)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)的實(shí)體間建立 約束。

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


          注意第二個(gè) createCriteria()返回一個(gè)新的 Criteria實(shí)例,該實(shí)例引用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)建一個(gè)新的 Criteria實(shí)例。)

          Cat實(shí)例所保存的之前兩次查詢所返回的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. 動(dòng)態(tài)關(guān)聯(lián)抓取

          你可以使用setFetchMode()在運(yùn)行時(shí)定義動(dòng)態(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();


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

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

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


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

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

          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)對(duì)象上放置條件。

          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 的實(shí)例工廠。我們通過調(diào)用 setProjection()應(yīng)用投影到一個(gè)查詢。

          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();


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

          你可以選擇把一個(gè)別名指派給一個(gè)投影,這樣可以使投影值被約束或排序所引用。下面是兩種不同的實(shí)現(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()方法簡便的將一個(gè)投影實(shí)例包裝到另外一個(gè) 別名的Projection實(shí)例中。簡而言之,當(dāng)你添加一個(gè)投影到一個(gè)投影列表中時(shí) 你可以為它指定一個(gè)別名:

          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類使你在一個(gè)session范圍之外創(chuàng)建一個(gè)查詢,并且可以使用任意的 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也可以用以表示子查詢。條件實(shí)例包含子查詢可以通過 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 閱讀(366) 評(píng)論(0)  編輯  收藏 所屬分類: Hibernate

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


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

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          收藏夾

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 修水县| 焦作市| 汽车| 南涧| 满洲里市| 独山县| 定结县| 曲阳县| 花莲市| 玛纳斯县| 历史| 阿拉尔市| 禹州市| 古交市| 汝南县| 漠河县| 乌恰县| 霞浦县| 英吉沙县| 光泽县| 永宁县| 凌海市| 汝州市| 潮安县| 工布江达县| 光泽县| 冷水江市| 越西县| 格尔木市| 哈密市| 比如县| 吴堡县| 德昌县| 察哈| 万盛区| 华容县| 二连浩特市| 睢宁县| 桃园县| 上虞市| 六枝特区|