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

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

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

    輕松

    記述我學(xué)習(xí)java的里程

    常用鏈接

    統(tǒng)計

    積分與排名

    友情鏈接

    最新評論

    Hibernate 復(fù)合查詢

     

             
    復(fù)合查詢主要是處理,具有關(guān)聯(lián)關(guān)系的兩個實體怎樣進行關(guān)聯(lián)查詢,比如User實體對象與Addres實體對象具有一對多的關(guān)聯(lián)關(guān)系,我們可以如下構(gòu)造符合查詢:
    Criteria criteria=session.createCriteria(User.class);
       Criteria addcriteria=criteria.createCriteria(“addresses”);(1)
       addcriteria.add(Express.like(“address”,”%tianjin%”));
      List list=criteria.list();
       for(int i=0;i
         User user=(User)list.get(i);
         System.out.println(user.getName()+”\n”);
         Set addresses=user.getAddresses();
         Iterator it=addresses.iterator();
         while(it.hasNext(){
          Address address=(Address)it.next();
          System.out.println(address.getAddress()+”\n”);
         }
       }
    當(dāng)執(zhí)行到了(1)處時,表明要針對User對象的addresses屬性添加新的查詢條件,因此當(dāng)執(zhí)行criteria.list()時,Hibernate會生成類似如下的SQL語句:
    Select * from user inner join address on user.id=address.id where address.address like ‘%shanghai%’;
    正如我們所見,我們可以通過向Criteria中添加保存關(guān)聯(lián)對象的集合屬性(addresses屬性保存與User對象相關(guān)聯(lián)的Address對象),來構(gòu)造復(fù)合查詢,在數(shù)據(jù)庫一端是通過內(nèi)連接查詢來實現(xiàn)。
     
    相關(guān):
    1. Hibernate
    2.
    QBC查詢:
       QBC查詢就是通過使用Hibernate提供的Query By Criteria API來查詢對象,這種API封裝了SQL語句的動態(tài)拼裝,對查詢提供了更加面向?qū)ο蟮墓δ芙涌凇N覀兛聪旅娴氖纠绦颍?/span>
    Criteria criteria=session.createCriteria(User.class);
    criteria.add(Expression.eq(“name”,”zx”));
    criteria.add(Expression.eq(“age”,new Integer(27));
    List list=criteria.list();
    當(dāng)執(zhí)行criteria.list()時會生成類似這樣的SQL語句:Select * from user where name=’zx’ and age=27;所以在這里我們可以看出,Criteria實際上是一個查詢?nèi)萜鳎鼘Σ樵儣l件表達式的添加進行了封裝,具體的查詢條件是通過add()方法添加的,而且具體的查詢條件的表達式運算是通過Expression指定的。Hibernate在運行期會根據(jù)Criteria指定的表達式條件來添加查詢條件,并且生成查詢語句。這種方式非常符合Java以及所有面向?qū)ο缶幊陶Z言的編程方式,所以大多數(shù)的持久層框架都提供了對這種方式查詢的支持。下面我們講解這種查詢方式的各個技術(shù)細(xì)節(jié)。
    1、Criteria查詢表達式:
    正如我們所見,Expression對查詢語句的表達式進行了封裝和限制,下表列出了Expression所有的方法,以及每個方法所對應(yīng)的查詢表達式及其限制。
    方法
    描述
    Expression.eq
    對應(yīng)SQL的“field=value”表達式
    如:Expression.eq(“name”,”zx”);
    Expression.allEq
    方法的參數(shù)為一個Map類型對象,包含多個名/值對對應(yīng)關(guān)系,相當(dāng)于多個Expression.eq的疊加
    Expression.gt
    對應(yīng)SQL的“field>value”表達式
    Expression.ge
    對應(yīng)SQL的“field>=value”表達式
    Expression.lt
    對應(yīng)SQL的“field”表達式
    Expression.le
    對應(yīng)SQL的“field<=value”表達式
    Expression.between
    對應(yīng)SQL語句的between表達式,如:查詢年齡在2127歲之間的用戶,可以寫成Expression.between(“age”,new Integer(21),new Integer(27));
    Expression.like
    對應(yīng)SQL語句的”field like value”表達式
    Expression.in
    對應(yīng)SQL語句的“field in(……)”表達式
    Expression.eqProperty
    用于比較兩個屬性值,對應(yīng)”field=field”SQL表達式
    Expression.gtProperty
    用于比較兩個屬性值,對應(yīng)”field>field”SQL表達式
    Expression.geProperty
    用于比較兩個屬性值,對應(yīng)”field>=field”SQL表達式
    Expression.ltProperty
    用于比較兩個屬性值,對應(yīng)”field表達式
    Expression.leProperty
    用于比較兩個屬性值,對應(yīng)”field<=field”SQL表達式
    Expression.and
    對應(yīng)SQL語句的And關(guān)系組合,如:Expression.and(Expression.eq(“name”,”zx”),Expression.eq(“sex”,”1”));
    Expression.or
    對應(yīng)SQL語句的Or關(guān)系組合,如:Expression.or(Expression.eq(“name”,”zx”),Expression.eq(“name”,”zhaoxin”));
    Expression.sql
    作為補充這個方法提供了原生SQL語句查詢的支持,在執(zhí)行時直接通過原生SQL語句進行限定,如:Expression.sql(“lower({alias}.name) like (?)”,“zhao%”,Hibernate.STRING) ;在運行時{ alias }將會由當(dāng)前查詢所關(guān)聯(lián)的實體類名替換,()中的?將會由”zhao%”替換,并且類型由Hibernate.STRING指定。
    注意:Expression各方法中的屬性參數(shù)(各方法中的第一個參數(shù))所指定的屬性名稱(如:name,sex),并不是數(shù)據(jù)庫表中的實際字段名稱,而是實體對象中映射實際數(shù)據(jù)表字段的類屬性名稱。
     
    2、示例查詢:
       示例查詢是通過Example類來完成的,Example類實現(xiàn)了Criterion接口,可以用作Criteria查詢條件,Example類的作用是:根據(jù)已有對象,查詢屬性值與之相同的其他對象。如下代碼所示:
    Criteria criteria=session.createCriteria(User.class);
    User exampleuser=new User(“zx”);
    criteria.add(Example.create(exampleuser));
    List list=criteria.list();
    for(int i=0;i
       User user=(User)list.get(i);
       System.out.println(user.getName()+”\n”);
    }
    上述代碼中User exampleuser=new User(“zx”);criteria.add(Example.create(exampleuser));兩句相當(dāng)于
    criteria.add(Expression.eq(“name”,”zx”));因此會生成類似如下的SQL語句:
    select * from user where name=’zx’;在上面的代碼中exampleuser稱為示例對象。
      Hibernate中隊示例查詢,默認(rèn)情況下會排除掉示例對象中屬性值為空的屬性,還可以調(diào)用Example.excludeNone(排除空串值)/excludeZeros(排除零值),或者調(diào)用Example.excludeProperty方法來指定排除特定屬性。
       示例查詢主要應(yīng)用于組合查詢中,比如根據(jù)用戶輸入的查詢條件動態(tài)生成最終的查詢語句,通過使用示例查詢,可以避免由于查詢條件過多而寫的大量if判斷語句。
    3、復(fù)合查詢:
    復(fù)合查詢主要是處理,具有關(guān)聯(lián)關(guān)系的兩個實體怎樣進行關(guān)聯(lián)查詢,比如User實體對象與Addres實體對象具有一對多的關(guān)聯(lián)關(guān)系,我們可以如下構(gòu)造符合查詢:
    Criteria criteria=session.createCriteria(User.class);
       Criteria addcriteria=criteria.createCriteria(“addresses”);(1)
       addcriteria.add(Express.like(“address”,”%tianjin%”));
      List list=criteria.list();
       for(int i=0;i
         User user=(User)list.get(i);
         System.out.println(user.getName()+”\n”);
         Set addresses=user.getAddresses();
         Iterator it=addresses.iterator();
         while(it.hasNext(){
          Address address=(Address)it.next();
          System.out.println(address.getAddress()+”\n”);
         }
       }
    當(dāng)執(zhí)行到了(1)處時,表明要針對User對象的addresses屬性添加新的查詢條件,因此當(dāng)執(zhí)行criteria.list()時,Hibernate會生成類似如下的SQL語句:
    Select * from user inner join address on user.id=address.id where address.address like ‘%shanghai%’;
    正如我們所見,我們可以通過向Criteria中添加保存關(guān)聯(lián)對象的集合屬性(addresses屬性保存與User對象相關(guān)聯(lián)的Address對象),來構(gòu)造復(fù)合查詢,在數(shù)據(jù)庫一端是通過內(nèi)連接查詢來實現(xiàn)。
     
     
     
    4、Criteria的高級特性:
    A、限定返回記錄條數(shù):
     我們可以通過利用Criteria.setFirstResult/setMaxResult方法來限定返回某一次查詢的記錄數(shù),如下代碼:
    Criteria criteria=session.createCriteria(User.class);
    criteria.setFirstResult(100);
    criteria.setMaxResult(200);
    通過以上代碼可以設(shè)定該次查詢返回user表中的從第100條記錄開始直到第200條記錄結(jié)束的100條記錄。
    B、對查詢結(jié)果進行排序:
     可通過使用net.sf.hibernate.expression.Order類可以對查詢結(jié)果集進行排序,如下面代碼:
    Criteria criteria=session.createCriteria(User.class);
    criteria.add(Expression.eq(“groupid”,”2”);
    criteria.addOrder(Order.asc(“name”));
    criteria.addOrder(Order.desc(“groupid”));
    List list=criteria.list();
    通過使用Order類的asc()/desc()方法,可以指定針對某個字段的排序邏輯,如果執(zhí)行上述代碼,會生成類似如下的SQL語句:
    Select * from user where groupid=’2’ order by name asc,groupid desc
    C、分組與統(tǒng)計:
       Hibernate3中,對Criteria又增添了新功能,可以支持分組與統(tǒng)計功能,在Hibernate3中增加了Projections以及ProjectionList類,這兩個類對分組與統(tǒng)計功能進行了封裝,如下代碼:
    Criteria criteria=session.createCriteria(User.class);
    criteria.setProjection(Projections.groupProperty(“age”));(1)
    List list=criteria.list();
    Iterator it=list.iterator();
    while(it.hasNext()){
     System.out.println(it.next());
    }
    通過(1)處的代碼,我們通過Projections類指定了用于分組的目標(biāo)屬性,當(dāng)進行檢索時Hibernate會生成類似如下的SQL語句:
    Select age from user group by age;
    還可以通過使用Projectionsavg()/rowCount()/count()/max()/min()/countDistinct()等方法來實現(xiàn)統(tǒng)計功能,如下面的代碼示例:
    Criteria criteria=session.createCriteria(User.class);
    criteria.setProjection(Projections.avg(“age”));(1)
    List list=criteria.list();
    Iterator it=list.iterator();
    while(it.hasNext()){
     System.out.println(it.next());
    }
    通過(1)處的代碼,我們實現(xiàn)了對用戶平均年齡的統(tǒng)計,當(dāng)進行檢索時,Hibernate會生成類似如下的SQL語句:
    Select avg(age) from user;
    另外,在SQL語句中的多條件分組與統(tǒng)計功能,可以利用ProjectionList類來實現(xiàn),如下面代碼所示:
    Criteria criteria=session.createCriteria(User.class);
    ProjectionList prolist=Projections.projectionList();
    prolist.add(Projections.groupProperty(“age”));
    prolist.add(Projections.rowCount());
    criteria.setProjection(prolist);
    List list=criteria.list();
    通過以上代碼,實現(xiàn)了對不同年齡人員數(shù)量的分組統(tǒng)計,當(dāng)進行檢索時,Hibernate會生成類似如下的SQL語句:
    Select age,count(*) from user group by age;
    5、DetachedCriteria:
    Hibernate2中,Criteria實例是與創(chuàng)建它的Session實例具有相同的生命周期的,也就是說,Session實例是它所創(chuàng)建的Criteria實例的宿主,當(dāng)Session關(guān)閉時,寄生于Session實例的Criteria都將失效。這就對Criteria的重用造成了困難,為了實現(xiàn)Criteria實例的重用,在Hibernate3中提供了一個DetachedCriteria類,DetachedCriteria實例的生命周期與Session實例的生命周期無關(guān),我們可以利用DetachedCriteria對一些常用的Criteria查詢條件進行抽離,當(dāng)需要進行檢索時再與Session實例關(guān)聯(lián),從而獲得運行期的Criteria實例。如下面的代碼所示:
       DetachedCriteria dc= DetachedCriteria.forClass(User.class);
       dc.add(Expression.eq(“name”,”zhaoxin”));
       dc.add(Expression.eq(“sex”,”1”));
       Criteria criteria=dc.getExecutableCriteria(session);
       Iterator it=criteria.list().iterator();
       while(it.hasNext()){
         User user=(User)it.next();
         System.out.println(user.getName());
       }
     正如我們所見,DetachedCriteria的生存周期與session實例無關(guān),當(dāng)需要進行檢索時,通過getExecutableCriteria(session)方法,與當(dāng)前的Session實例關(guān)聯(lián)并獲得運行期的Criteria實例,完成檢索。
    DetachedCriteria也可以用于完成子查詢功能,如下代碼所示:
    DetachedCriteria dc= DetachedCriteria.forClass(User.class);
    dc.setProjection(Projections.avg(“age”));
    Criteria criteria=session.createCriteria(User.class);
    criteria.add(Subqueries.propertyGt(“age”,dc));
    List list=criteria.list();
    通過Subqueries類,實現(xiàn)了添加子查詢的功能,我們將DetachedCriteria所設(shè)定的查詢條件,當(dāng)作子查詢添加到了運行時Criteria實例的查詢條件中,當(dāng)執(zhí)行檢索時Hibernate會生成類似如下的SQL語句:
    Select * from user where age>(select avg(age) from user group by age);

    posted on 2008-03-27 10:23 輕松 閱讀(5340) 評論(0)  編輯  收藏 所屬分類: Hibernate

    主站蜘蛛池模板: 亚洲资源最新版在线观看| 日本高清免费观看| 久久精品国产亚洲av麻豆蜜芽 | 亚洲一级特黄大片无码毛片| 国产妇乱子伦视频免费| a在线观看免费网址大全| 国产亚洲精品91| 亚洲日韩精品无码专区加勒比| 亚洲图片在线观看| 亚洲日韩精品一区二区三区| 国产免费av片在线播放| 成年人网站免费视频| 免费国产污网站在线观看15| aa级毛片毛片免费观看久| 特级毛片免费观看视频| 亚洲AV性色在线观看| 亚洲一久久久久久久久| 亚洲av永久无码精品三区在线4| 亚洲欧洲日韩不卡| 亚洲a在线视频视频| 久久九九亚洲精品| 亚洲一区二区三区在线观看精品中文| 免费看国产一级片| 免费中文字幕在线观看| 全部免费国产潢色一级| 日韩免费视频播播| 日韩精品无码人妻免费视频| 真实乱视频国产免费观看| 成人最新午夜免费视频| 成人免费看片又大又黄| 四色在线精品免费观看| 破了亲妺妺的处免费视频国产| 国产精品无码一二区免费| 免费观看日本污污ww网站一区| 亚洲AⅤ无码一区二区三区在线| 成人亚洲综合天堂| 亚洲午夜无码片在线观看影院猛| 国产亚洲精品线观看动态图| 亚洲精品无码AV中文字幕电影网站| 亚洲国产精品尤物yw在线| 国产亚洲精品久久久久秋霞|