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

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

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

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

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


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

    一個單獨(dú)的查詢條件是org.hibernate.criterion.Criterion 接口的一個實(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í)例是獲得一個條件的另外一種途徑。你可以通過調(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)的實(shí)體間建立 約束。

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


    注意第二個 createCriteria()返回一個新的 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)建一個新的 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. 動態(tài)關(guān)聯(lián)抓取

    你可以使用setFetchMode()在運(yùn)行時(shí)定義動態(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類允許你通過一個給定實(shí)例 構(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使之更實(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)對象上放置條件。

    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)用投影到一個查詢。

    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子句中。

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

    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也可以用以表示子查詢。條件實(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 閱讀(362) 評論(0)  編輯  收藏 所屬分類: Hibernate

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


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

    常用鏈接

    留言簿(3)

    隨筆分類

    隨筆檔案

    收藏夾

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 黄网站免费在线观看| 亚洲av永久无码精品国产精品| 日韩电影免费在线观看| 色噜噜噜噜亚洲第一| 亚洲国产精品人久久电影| 亚洲AV一宅男色影视| 精品国产日韩亚洲一区| 日本不卡在线观看免费v| 成人黄色免费网站| 精品成人免费自拍视频| 国产99视频精品免费视频76| 亚洲GV天堂GV无码男同| 亚洲精品一二三区| 亚洲午夜电影在线观看| 亚洲视频精品在线观看| 亚洲永久永久永久永久永久精品| 亚洲精品少妇30p| 在线A亚洲老鸭窝天堂| 亚洲欧洲自拍拍偷精品 美利坚| 日韩免费一级毛片| 高清国语自产拍免费视频国产 | 国产aa免费视频| 日本特黄a级高清免费大片| 无码人妻一区二区三区免费| 91成年人免费视频| 国产曰批免费视频播放免费s| 亚洲精品视频在线观看免费| 曰批全过程免费视频播放网站| 人妻丰满熟妇无码区免费 | 日日噜噜噜噜夜夜爽亚洲精品 | 一级毛片免费毛片毛片| 黄网站色视频免费看无下截 | 亚洲综合亚洲综合网成人| 亚洲高清最新av网站| 亚洲精品无码专区2| 亚洲精品无码日韩国产不卡?V | 久久免费国产精品一区二区| 男女午夜24式免费视频| 99热免费在线观看| 国产精品久久免费| 24小时日本在线www免费的|