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

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

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

    隨筆 - 6  文章 - 129  trackbacks - 0
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(14)

    隨筆檔案(6)

    文章分類(467)

    文章檔案(423)

    相冊

    收藏夾(18)

    JAVA

    搜索

    •  

    積分與排名

    • 積分 - 825709
    • 排名 - 49

    最新評論

    閱讀排行榜

    評論排行榜

  • 具有一個直觀的、可擴展的條件查詢API是Hibernate的特色。    
  •   
  • 15.1. 創建一個Criteria 實例   
  • org.hibernate.Criteria接口表示特定持久類的一個查詢。Session是 Criteria實例的工廠。    
  •   
  • Criteria crit = sess.createCriteria(Cat.class);   
  • crit.setMaxResults(50);   
  • List cats = crit.list();   
  • 15.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();   
  • 15.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();   
  • 15.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");   
  • }   
  • 15.5. 動態關聯抓取   
  • 你可以使用setFetchMode()在運行時定義動態關聯抓取的語義。    
  •   
  • List cats = sess.createCriteria(Cat.class)   
  •     .add( Restrictions.like("name""Fritz%") )   
  •     .setFetchMode("mate", FetchMode.EAGER)   
  •     .setFetchMode("kittens", FetchMode.EAGER)   
  •     .list();   
  • 這個查詢可以通過外連接抓取mate和kittens。 查看第 19.1 節 “ 抓取策略(Fetching strategies) ”可以獲得更多信息。    
  •   
  • 15.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();   
  • 15.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();   
  • 15.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();   
  •     
  •   
  •  //具體應用   
  •   
  • 把HSQL語句用Criteria代替,感覺更加美觀一點,而且還支持中文,要是HSQL想支持中文,你得使用占位符來設置,具體可參照:http://.blogdriver.com//983190.html   
  •   
  • 那么Criteria的用法是這樣的:   
  •   
  •     public Collection findCriteria(final DetachedCriteria dc, final IPage page) {   
  •         return (List) getHibernateTemplate().execute(new HibernateCallback(){   
  •             public Object doInHibernate(Session session) throws HibernateException, SQLException {   
  •                 Criteria c = dc.getExecutableCriteria(session);   
  •                    
  •                 page.setTotalCount(((Integer) c.setProjection(Projections.rowCount()).uniqueResult()).intValue());    
  •                 c.setProjection(null);    
  •                 c.setResultTransformer(Criteria.ROOT_ENTITY);   
  •                 c.setFirstResult(page.getBeginIndex());   
  •                 c.setMaxResults(page.getPageSize());   
  •                 return c.list();   
  •             }   
  •         }, true);   
  •     }   
  •   
  • 其中的參數true表示要Spring強制傳入SessionImpl,而不是傳入Proxy代理類,page.setTotalCount(((Integer) c.setProjection(Projections.rowCount()).uniqueResult()).intValue());    
  • c.setProjection(null); 目的是為了獲得行數,并設置投影為空,為的是返回List出來,如果不設置setProjection(null)的話,c.list將返回的是行數(int型),而不是所要查詢的數據庫信息。但是Criteria的ResultTransformer會變成PassThroughResultTransformer,criteria.list的時候可能結果會跟理想的不一樣。所以我們還要再c.setResultTransformer(Criteria.ROOT_ENTITY);把結果以Entity的形式返回,而不是Object[]的形式返回。具體的ResultTransformer可以google一下。   
  •   
  • 測試代碼如下:   
  •   
  •     public void testCriteria() {   
  •         DetachedCriteria dc = DetachedCriteria.forClass(User.class);   
  •         dc.add(Restrictions.eq("name""user")).add(Restrictions.like("description""%主管人員%"));   
  •         IPage page = new Page();   
  •         page.setCurrentPage(1);   
  •         page.setPageSize(10);   
  •         Collection list = _userDAO.findCriteria(dc, page);   
  •         assertNotNull(list);   
  •         assertEquals(1, list.size());   
  •     }   
  •   
  • 來源:http://aimtime812110.spaces.msn.com/Blog/cns!1pXyGS-D6ufSs-1GPdk-fkiQ!108.entry   


  • posted on 2007-10-11 22:13 Ke 閱讀(577) 評論(0)  編輯  收藏 所屬分類: hibernate
    主站蜘蛛池模板: 亚洲2022国产成人精品无码区| 亚洲av极品无码专区在线观看| 野花香在线视频免费观看大全| 亚洲美女中文字幕| 日本特黄a级高清免费大片| 精品一区二区三区高清免费观看| 亚洲国产精品无码AAA片| 成人毛片免费观看视频大全| 久久国产免费直播| 亚洲一区免费视频| 亚洲熟妇无码八AV在线播放| 日本精品人妻无码免费大全| 国产精品福利片免费看| 亚洲成人一级电影| 国产亚洲色视频在线| 日本在线高清免费爱做网站| 亚洲第一视频在线观看免费| 亚洲六月丁香婷婷综合| 亚洲中文字幕无码一区| 免费无码又爽又刺激高潮| 日韩免费电影网站| 免费播放国产性色生活片| 亚洲综合无码一区二区三区| 亚洲毛片网址在线观看中文字幕| 91麻豆最新在线人成免费观看 | 成人性生交大片免费看中文| 亚洲资源最新版在线观看| 亚洲国产精品高清久久久| 免费A级毛片无码A| 91免费资源网站入口| 久久久精品免费视频| 特级aa**毛片免费观看| 色偷偷女男人的天堂亚洲网| 亚洲AV无码国产丝袜在线观看 | 国产精品亚洲片在线观看不卡| 国产色爽女小说免费看| 久久久高清免费视频| 99热这里有免费国产精品| www在线观看播放免费视频日本| 亚洲大尺度无码无码专线一区| 亚洲码在线中文在线观看|