<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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. 創建一個Criteria 實例

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

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


    16.2. 限制結果集內容

    一個單獨的查詢條件是org.hibernate.criterion.Criterion 接口的一個實例。org.hibernate.criterion.Restrictions類 定義了獲得某些內置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提供了相當多的內置criterion類型(Restrictions 子類), 但是尤其有用的是可以允許你直接使用SQL。

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


    {alias}占位符應當被替換為被查詢實體的列別名。

    Property實例是獲得一個條件的另外一種途徑。你可以通過調用Property.forName() 創建一個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. 結果集排序

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

    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. 關聯

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

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


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

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

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


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

    Cat實例所保存的之前兩次查詢所返回的kittens集合是 沒有被條件預過濾的。如果你希望只獲得符合條件的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. 動態關聯抓取

    你可以使用setFetchMode()在運行時定義動態關聯抓取的語義。

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


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

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

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


    版本屬性、標識符和關聯被忽略。默認情況下值為null的屬性將被排除。

    你可以自行調整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在關聯對象上放置條件。

    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 的實例工廠。我們通過調用 setProjection()應用投影到一個查詢。

    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" 。某些投影類型就是被定義為 分組投影,他們也出現在SQL的group by子句中。

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

    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實例中。簡而言之,當你添加一個投影到一個投影列表中時 你可以為它指定一個別名:

    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范圍之外創建一個查詢,并且可以使用任意的 Session來執行它。

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


    甚至相互關聯的子查詢也是有可能的:

    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 閱讀(361) 評論(0)  編輯  收藏 所屬分類: Hibernate

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


    網站導航:
     
    <2007年5月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    常用鏈接

    留言簿(3)

    隨筆分類

    隨筆檔案

    收藏夾

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲一区视频在线播放| 国产成人亚洲毛片| 亚洲成a人片在线观看日本麻豆 | 国产高清免费在线| 真人做人试看60分钟免费视频| baoyu116.永久免费视频| 青青久久精品国产免费看| 亚洲熟妇自偷自拍另欧美| 亚洲avav天堂av在线不卡| 亚洲综合日韩久久成人AV| 四虎影视永久免费观看地址| 成年人免费视频观看| 18禁网站免费无遮挡无码中文| 欧洲人免费视频网站在线| 野花高清在线电影观看免费视频 | 中国一级毛片免费看视频| 美美女高清毛片视频黄的一免费 | 67194熟妇在线永久免费观看| 久久精品无码专区免费东京热| 三年片在线观看免费| 岛国精品一区免费视频在线观看| 老司机午夜在线视频免费| 精品无码专区亚洲| 亚洲国产精品无码专区影院| 亚洲片一区二区三区| 全部免费a级毛片| 四虎免费久久影院| 四虎影在线永久免费观看| 国产伦精品一区二区三区免费下载 | 日本道免费精品一区二区| 久久久久久噜噜精品免费直播| 亚洲一级视频在线观看| 亚洲伊人久久大香线蕉| 亚洲伊人久久大香线蕉影院| 亚洲Av无码一区二区二三区| 精品亚洲AV无码一区二区三区 | 亚洲一区二区三区免费在线观看| 99久久国产免费-99久久国产免费| 特级无码毛片免费视频尤物| 蜜芽亚洲av无码一区二区三区 | 国产高清免费在线|