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

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

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

    posts - 33,  comments - 11,  trackbacks - 0
    Hibernate QBC查詢
                QBC查詢:
                   QBC查詢就是通過使用Hibernate提供的Query By Criteria
                API來查詢對象,這種API封裝了SQL語句的動態拼裝,對查詢提供了更加面向對象的功能接口。我們看下面的示例程序:
                Criteria criteria=session.createCriteria(User.class);
                criteria.add(Expression.eq(“name”,”zx”));
                criteria.add(Expression.eq(“age”,new Integer(27));
                List list=criteria.list();
                當執行criteria.list()時會生成類似這樣的SQL語句:Select * from user where name=’zx’
                and
                age=27;所以在這里我們可以看出,Criteria實際上是一個查詢容器,它對查詢條件表達式的添加進行了封裝,具體的查詢條件是通過add()方法添加的,而且具體的查詢條件的表達式運算是通過Expression指定的。Hibernate在運行期會根據Criteria指定的表達式條件來添加查詢條件,并且生成查詢語句。這種方式非常符合Java以及所有面向對象編程語言的編程方式,所以大多數的持久層框架都提供了對這種方式查詢的支持。下面我們講解這種查詢方式的各個技術細節。
                1、Criteria查詢表達式:
                正如我們所見,Expression對查詢語句的表達式進行了封裝和限制,下表列出了Expression所有的方法,以及每個方法所對應的查詢表達式及其限制。
                      方法描述
                      Expression.eq對應SQL的“field=value”表達式
                      如:Expression.eq(“name”,”zx”);
                      Expression.allEq方法的參數為一個Map類型對象,包含多個名/值對對應關系,相當于多個Expression.eq的疊加
                      Expression.gt對應SQL的“field>value”表達式
                      Expression.ge對應SQL的“field>=value”表達式
                      Expression.lt對應SQL的“field”表達式
                      Expression.le對應SQL的“field<=value”表達式
                      Expression.between對應SQL語句的between表達式,如:查詢年齡在21與27歲之間的用戶,可以寫成Expression.between(“age”,new
                      Integer(21),new Integer(27));
                      Expression.like對應SQL語句的”field like value”表達式
                      Expression.in對應SQL語句的“field in(……)”表達式
                      Expression.eqProperty用于比較兩個屬性值,對應”field=field”SQL表達式
                      Expression.gtProperty用于比較兩個屬性值,對應”field>field”SQL表達式
                      Expression.geProperty用于比較兩個屬性值,對應”field>=field”SQL表達式
                      Expression.ltProperty用于比較兩個屬性值,對應”field表達式
                      Expression.leProperty用于比較兩個屬性值,對應”field<=field”SQL表達式
                      Expression.and對應SQL語句的And關系組合,如:Expression.and(Expression.eq(“name”,”zx”),Expression.eq(“sex”,”1”));
                      Expression.or對應SQL語句的Or關系組合,如:Expression.or(Expression.eq(“name”,”zx”),Expression.eq(“name”,”zhaoxin”));
                      Expression.sql作為補充這個方法提供了原生SQL語句查詢的支持,在執行時直接通過原生SQL語句進行限定,如:Expression.sql(“lower({alias}.name)
                      like (?)”,“zhao%”,Hibernate.STRING) ;在運行時{ alias
                      }將會由當前查詢所關聯的實體類名替換,()中的?將會由”zhao%”替換,并且類型由Hibernate.STRING指定。

                注意:Expression各方法中的屬性參數(各方法中的第一個參數)所指定的屬性名稱(如:name,sex),并不是數據庫表中的實際字段名稱,而是實體對象中映射實際數據表字段的類屬性名稱。
                
                2、示例查詢:
                  
                示例查詢是通過Example類來完成的,Example類實現了Criterion接口,可以用作Criteria查詢條件,Example類的作用是:根據已有對象,查詢屬性值與之相同的其他對象。如下代碼所示:
                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));兩句相當于
                criteria.add(Expression.eq(“name”,”zx”));因此會生成類似如下的SQL語句:
                select * from user where name=’zx’;在上面的代碼中exampleuser稱為示例對象。
                 
                在Hibernate中隊示例查詢,默認情況下會排除掉示例對象中屬性值為空的屬性,還可以調用Example.excludeNone(排除空串值)/excludeZeros(排除零值),或者調用Example.excludeProperty方法來指定排除特定屬性。
                  
                示例查詢主要應用于組合查詢中,比如根據用戶輸入的查詢條件動態生成最終的查詢語句,通過使用示例查詢,可以避免由于查詢條件過多而寫的大量if判斷語句。
                3、復合查詢:
                復合查詢主要是處理,具有關聯關系的兩個實體怎樣進行關聯查詢,比如User實體對象與Addres實體對象具有一對多的關聯關系,我們可以如下構造符合查詢:
                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”);
                     }
                   }
                當執行到了(1)處時,表明要針對User對象的addresses屬性添加新的查詢條件,因此當執行criteria.list()時,Hibernate會生成類似如下的SQL語句:
                Select * from user inner join address on user.id=address.id where
                address.address like ‘%shanghai%’;
                正如我們所見,我們可以通過向Criteria中添加保存關聯對象的集合屬性(addresses屬性保存與User對象相關聯的Address對象),來構造復合查詢,在數據庫一端是通過內連接查詢來實現。
                
                
                
                4、Criteria的高級特性:
                A、限定返回記錄條數:
                 我們可以通過利用Criteria.setFirstResult/setMaxResult方法來限定返回某一次查詢的記錄數,如下代碼:
                Criteria criteria=session.createCriteria(User.class);
                criteria.setFirstResult(100);
                criteria.setMaxResult(200);
                通過以上代碼可以設定該次查詢返回user表中的從第100條記錄開始直到第200條記錄結束的100條記錄。
                B、對查詢結果進行排序:
                 可通過使用net.sf.hibernate.expression.Order類可以對查詢結果集進行排序,如下面代碼:
                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()方法,可以指定針對某個字段的排序邏輯,如果執行上述代碼,會生成類似如下的SQL語句:
                Select * from user where groupid=’2’ order by name asc,groupid desc
                C、分組與統計:
                  
                在Hibernate3中,對Criteria又增添了新功能,可以支持分組與統計功能,在Hibernate3中增加了Projections以及ProjectionList類,這兩個類對分組與統計功能進行了封裝,如下代碼:
                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類指定了用于分組的目標屬性,當進行檢索時Hibernate會生成類似如下的SQL語句:
                Select age from user group by age;
                還可以通過使用Projections的avg()/rowCount()/count()/max()/min()/countDistinct()等方法來實現統計功能,如下面的代碼示例:
                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)處的代碼,我們實現了對用戶平均年齡的統計,當進行檢索時,Hibernate會生成類似如下的SQL語句:
                Select avg(age) from user;
                另外,在SQL語句中的多條件分組與統計功能,可以利用ProjectionList類來實現,如下面代碼所示:
                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();

                通過以上代碼,實現了對不同年齡人員數量的分組統計,當進行檢索時,Hibernate會生成類似如下的SQL語句:
                Select age,count(*) from user group by age;
                5、DetachedCriteria:
                在Hibernate2中,Criteria實例是與創建它的Session實例具有相同的生命周期的,也就是說,Session實例是它所創建的Criteria實例的宿主,當Session關閉時,寄生于Session實例的Criteria都將失效。這就對Criteria的重用造成了困難,為了實現Criteria實例的重用,在Hibernate3中提供了一個DetachedCriteria類,DetachedCriteria實例的生命周期與Session實例的生命周期無關,我們可以利用DetachedCriteria對一些常用的Criteria查詢條件進行抽離,當需要進行檢索時再與Session實例關聯,從而獲得運行期的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實例無關,當需要進行檢索時,通過getExecutableCriteria(session)方法,與當前的Session實例關聯并獲得運行期的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類,實現了添加子查詢的功能,我們將DetachedCriteria所設定的查詢條件,當作子查詢添加到了運行時Criteria實例的查詢條件中,當執行檢索時Hibernate會生成類似如下的SQL語句:
                Select * from user where age>(select avg(age) from user group by
                age);
    posted on 2009-07-19 16:12 方濤升 閱讀(371) 評論(0)  編輯  收藏 所屬分類: hibernate

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


    網站導航:
     
    <2009年7月>
    2829301234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

    常用鏈接

    留言簿(2)

    隨筆分類

    隨筆檔案

    文章分類

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲免费在线视频播放| 亚洲一级毛片免费观看| 啦啦啦高清视频在线观看免费| gogo免费在线观看| 中文字幕亚洲情99在线| 老汉色老汉首页a亚洲| 国产福利电影一区二区三区,亚洲国模精品一区 | 中中文字幕亚洲无线码| 日本亚洲欧洲免费天堂午夜看片女人员 | 综合亚洲伊人午夜网| 午夜老司机免费视频| 青青草a免费线观a| 蜜臀AV免费一区二区三区| 国产精品免费AV片在线观看| 一级毛片免费一级直接观看| 小说专区亚洲春色校园| 亚洲欧美日韩中文字幕一区二区三区| 亚洲妇女水蜜桃av网网站| 久久精品九九亚洲精品| 亚洲电影国产一区| 久久精品国产亚洲7777| 一级毛片完整版免费播放一区| 日韩免费观看的一级毛片| 亚洲毛片免费观看| 四虎影视成人永久免费观看视频| 中文字幕看片在线a免费| 亚洲国产免费综合| 一进一出60分钟免费视频| 未满十八私人高清免费影院| 美女黄色免费网站| 五月天婷婷精品免费视频| 一级特级女人18毛片免费视频| 免费福利在线观看| 日韩大片在线永久免费观看网站| 美女黄频视频大全免费的| 一级毛片在线免费视频| 两性色午夜视频免费播放| 永久在线观看免费视频| 99免费在线观看视频| 18禁美女裸体免费网站| 在线视频精品免费|