隨筆 - 6  文章 - 129  trackbacks - 0
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(14)

          隨筆檔案(6)

          文章分類(467)

          文章檔案(423)

          相冊

          收藏夾(18)

          JAVA

          搜索

          •  

          積分與排名

          • 積分 - 827240
          • 排名 - 49

          最新評論

          閱讀排行榜

          評論排行榜

        1. 具有一個直觀的、可擴展的條件查詢API是Hibernate的特色。    
        2.   
        3. 15.1. 創建一個Criteria 實例   
        4. org.hibernate.Criteria接口表示特定持久類的一個查詢。Session是 Criteria實例的工廠。    
        5.   
        6. Criteria crit = sess.createCriteria(Cat.class);   
        7. crit.setMaxResults(50);   
        8. List cats = crit.list();   
        9. 15.2. 限制結果集內容   
        10. 一個單獨的查詢條件是org.hibernate.criterion.Criterion 接口的一個實例。org.hibernate.criterion.Restrictions類 定義了獲得某些內置Criterion類型的工廠方法。    
        11.   
        12. List cats = sess.createCriteria(Cat.class)   
        13.     .add( Restrictions.like("name""Fritz%") )   
        14.     .add( Restrictions.between("weight", minWeight, maxWeight) )   
        15.     .list();   
        16. 約束可以按邏輯分組。    
        17.   
        18. List cats = sess.createCriteria(Cat.class)   
        19.     .add( Restrictions.like("name""Fritz%") )   
        20.     .add( Restrictions.or(   
        21.         Restrictions.eq( "age"new Integer(0) ),   
        22.         Restrictions.isNull("age")   
        23.     ) )   
        24.     .list();   
        25. List cats = sess.createCriteria(Cat.class)   
        26.     .add( Restrictions.in( "name"new String[] { "Fritz""Izi""Pk" } ) )   
        27.     .add( Restrictions.disjunction()   
        28.         .add( Restrictions.isNull("age") )   
        29.      .add( Restrictions.eq("age"new Integer(0) ) )   
        30.      .add( Restrictions.eq("age"new Integer(1) ) )   
        31.      .add( Restrictions.eq("age"new Integer(2) ) )   
        32.     ) )   
        33.     .list();   
        34. Hibernate提供了相當多的內置criterion類型(Restrictions 子類), 但是尤其有用的是可以允許你直接使用SQL。    
        35.   
        36. List cats = sess.createCriteria(Cat.class)   
        37.     .add( Restrictions.sql("lower({alias}.name) like lower(?)""Fritz%", Hibernate.STRING) )   
        38.     .list();   
        39. {alias}占位符應當被替換為被查詢實體的列別名。    
        40.   
        41. Property實例是獲得一個條件的另外一種途徑。你可以通過調用Property.forName() 創建一個Property。    
        42.   
        43. Property age = Property.forName("age");   
        44. List cats = sess.createCriteria(Cat.class)   
        45.     .add( Restrictions.disjunction()   
        46.         .add( age.isNull() )   
        47.      .add( age.eq( new Integer(0) ) )   
        48.      .add( age.eq( new Integer(1) ) )   
        49.      .add( age.eq( new Integer(2) ) )   
        50.     ) )   
        51.     .add( Property.forName("name").in( new String[] { "Fritz""Izi""Pk" } ) )   
        52.     .list();   
        53. 15.3. 結果集排序   
        54. 你可以使用org.hibernate.criterion.Order來為查詢結果排序。    
        55.   
        56. List cats = sess.createCriteria(Cat.class)   
        57.     .add( Restrictions.like("name""F%")   
        58.     .addOrder( Order.asc("name") )   
        59.     .addOrder( Order.desc("age") )   
        60.     .setMaxResults(50)   
        61.     .list();   
        62. List cats = sess.createCriteria(Cat.class)   
        63.     .add( Property.forName("name").like("F%") )   
        64.     .addOrder( Property.forName("name").asc() )   
        65.     .addOrder( Property.forName("age").desc() )   
        66.     .setMaxResults(50)   
        67.     .list();   
        68. 15.4. 關聯   
        69. 你可以使用createCriteria()非常容易的在互相關聯的實體間建立 約束。    
        70.   
        71. List cats = sess.createCriteria(Cat.class)   
        72.     .add( Restrictions.like("name""F%")   
        73.     .createCriteria("kittens")   
        74.         .add( Restrictions.like("name""F%")   
        75.     .list();   
        76. 注意第二個 createCriteria()返回一個新的 Criteria實例,該實例引用kittens 集合中的元素。    
        77.   
        78. 接下來,替換形態在某些情況下也是很有用的。    
        79.   
        80. List cats = sess.createCriteria(Cat.class)   
        81.     .createAlias("kittens""kt")   
        82.     .createAlias("mate""mt")   
        83.     .add( Restrictions.eqProperty("kt.name""mt.name") )   
        84.     .list();   
        85. (createAlias()并不創建一個新的 Criteria實例。)    
        86.   
        87. Cat實例所保存的之前兩次查詢所返回的kittens集合是 沒有被條件預過濾的。如果你希望只獲得符合條件的kittens, 你必須使用returnMaps()。    
        88.   
        89. List cats = sess.createCriteria(Cat.class)   
        90.     .createCriteria("kittens""kt")   
        91.         .add( Restrictions.eq("name""F%") )   
        92.     .returnMaps()   
        93.     .list();   
        94. Iterator iter = cats.iterator();   
        95. while ( iter.hasNext() ) {   
        96.     Map map = (Map) iter.next();   
        97.     Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);   
        98.     Cat kitten = (Cat) map.get("kt");   
        99. }   
        100. 15.5. 動態關聯抓取   
        101. 你可以使用setFetchMode()在運行時定義動態關聯抓取的語義。    
        102.   
        103. List cats = sess.createCriteria(Cat.class)   
        104.     .add( Restrictions.like("name""Fritz%") )   
        105.     .setFetchMode("mate", FetchMode.EAGER)   
        106.     .setFetchMode("kittens", FetchMode.EAGER)   
        107.     .list();   
        108. 這個查詢可以通過外連接抓取mate和kittens。 查看第 19.1 節 “ 抓取策略(Fetching strategies) ”可以獲得更多信息。    
        109.   
        110. 15.6. 查詢示例   
        111. org.hibernate.criterion.Example類允許你通過一個給定實例 構建一個條件查詢。    
        112.   
        113. Cat cat = new Cat();   
        114. cat.setSex('F');   
        115. cat.setColor(Color.BLACK);   
        116. List results = session.createCriteria(Cat.class)   
        117.     .add( Example.create(cat) )   
        118.     .list();   
        119. 版本屬性、標識符和關聯被忽略。默認情況下值為null的屬性將被排除。    
        120.   
        121. 你可以自行調整Example使之更實用。    
        122.   
        123. Example example = Example.create(cat)   
        124.     .excludeZeroes()           //exclude zero valued properties   
        125.     .excludeProperty("color")  //exclude the property named "color"   
        126.     .ignoreCase()              //perform case insensitive string comparisons   
        127.     .enableLike();             //use like for string comparisons   
        128. List results = session.createCriteria(Cat.class)   
        129.     .add(example)   
        130.     .list();   
        131. 你甚至可以使用examples在關聯對象上放置條件。    
        132.   
        133. List results = session.createCriteria(Cat.class)   
        134.     .add( Example.create(cat) )   
        135.     .createCriteria("mate")   
        136.         .add( Example.create( cat.getMate() ) )   
        137.     .list();   
        138. 15.7. 投影(Projections)、聚合(aggregation)和分組(grouping)   
        139. org.hibernate.criterion.Projections是 Projection 的實例工廠。我們通過調用 setProjection()應用投影到一個查詢。    
        140.   
        141. List results = session.createCriteria(Cat.class)   
        142.     .setProjection( Projections.rowCount() )   
        143.     .add( Restrictions.eq("color", Color.BLACK) )   
        144.     .list();   
        145. List results = session.createCriteria(Cat.class)   
        146.     .setProjection( Projections.projectionList()   
        147.         .add( Projections.rowCount() )   
        148.         .add( Projections.avg("weight") )   
        149.         .add( Projections.max("weight") )   
        150.         .add( Projections.groupProperty("color") )   
        151.     )   
        152.     .list();   
        153. 在一個條件查詢中沒有必要顯式的使用 "group by" 。某些投影類型就是被定義為 分組投影,他們也出現在SQL的group by子句中。    
        154.   
        155. 你可以選擇把一個別名指派給一個投影,這樣可以使投影值被約束或排序所引用。下面是兩種不同的實現方式:    
        156.   
        157. List results = session.createCriteria(Cat.class)   
        158.     .setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) )   
        159.     .addOrder( Order.asc("colr") )   
        160.     .list();   
        161. List results = session.createCriteria(Cat.class)   
        162.     .setProjection( Projections.groupProperty("color").as("colr") )   
        163.     .addOrder( Order.asc("colr") )   
        164.     .list();   
        165. alias()和as()方法簡便的將一個投影實例包裝到另外一個 別名的Projection實例中。簡而言之,當你添加一個投影到一個投影列表中時 你可以為它指定一個別名:    
        166.   
        167. List results = session.createCriteria(Cat.class)   
        168.     .setProjection( Projections.projectionList()   
        169.         .add( Projections.rowCount(), "catCountByColor" )   
        170.         .add( Projections.avg("weight"), "avgWeight" )   
        171.         .add( Projections.max("weight"), "maxWeight" )   
        172.         .add( Projections.groupProperty("color"), "color" )   
        173.     )   
        174.     .addOrder( Order.desc("catCountByColor") )   
        175.     .addOrder( Order.desc("avgWeight") )   
        176.     .list();   
        177. List results = session.createCriteria(Domestic.class"cat")   
        178.     .createAlias("kittens""kit")   
        179.     .setProjection( Projections.projectionList()   
        180.         .add( Projections.property("cat.name"), "catName" )   
        181.         .add( Projections.property("kit.name"), "kitName" )   
        182.     )   
        183.     .addOrder( Order.asc("catName") )   
        184.     .addOrder( Order.asc("kitName") )   
        185.     .list();   
        186. 你也可以使用Property.forName()來表示投影:    
        187.   
        188. List results = session.createCriteria(Cat.class)   
        189.     .setProjection( Property.forName("name") )   
        190.     .add( Property.forName("color").eq(Color.BLACK) )   
        191.     .list();   
        192. List results = session.createCriteria(Cat.class)   
        193.     .setProjection( Projections.projectionList()   
        194.         .add( Projections.rowCount().as("catCountByColor") )   
        195.         .add( Property.forName("weight").avg().as("avgWeight") )   
        196.         .add( Property.forName("weight").max().as("maxWeight") )   
        197.         .add( Property.forName("color").group().as("color" )   
        198.     )   
        199.     .addOrder( Order.desc("catCountByColor") )   
        200.     .addOrder( Order.desc("avgWeight") )   
        201.     .list();   
        202. 15.8. 離線(detached)查詢和子查詢   
        203. DetachedCriteria類使你在一個session范圍之外創建一個查詢,并且可以使用任意的 Session來執行它。    
        204.   
        205. DetachedCriteria query = DetachedCriteria.forClass(Cat.class)   
        206.     .add( Property.forName("sex").eq('F') );   
        207.        
        208. Session session = ....;   
        209. Transaction txn = session.beginTransaction();   
        210. List results = query.getExecutableCriteria(session).setMaxResults(100).list();   
        211. txn.commit();   
        212. session.close();   
        213. DetachedCriteria也可以用以表示子查詢。條件實例包含子查詢可以通過 Subqueries或者Property獲得。    
        214.   
        215. DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)   
        216. .setProjection( Property.forName("weight").avg() );   
        217. session.createCriteria(Cat.class)   
        218. .add( Property.forName("weight).gt(avgWeight) )  
        219. .list();  
        220. DetachedCriteria weights = DetachedCriteria.forClass(Cat.class)  
        221. .setProjection( Property.forName("weight") );  
        222. session.createCriteria(Cat.class)  
        223. .add( Subqueries.geAll("weight", weights) )  
        224. .list();  
        225. 甚至相互關聯的子查詢也是有可能的:   
        226.  
        227. DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class, "cat2")  
        228. .setProjection( Property.forName("weight").avg() )  
        229. .add( Property.forName("cat2.sex").eqProperty("cat.sex") );  
        230. session.createCriteria(Cat.class, "cat")  
        231. .add( Property.forName("weight).gt(avgWeightForSex) )   
        232. .list();   
        233.     
        234.   
        235.  //具體應用   
        236.   
        237. 把HSQL語句用Criteria代替,感覺更加美觀一點,而且還支持中文,要是HSQL想支持中文,你得使用占位符來設置,具體可參照:http://.blogdriver.com//983190.html   
        238.   
        239. 那么Criteria的用法是這樣的:   
        240.   
        241.     public Collection findCriteria(final DetachedCriteria dc, final IPage page) {   
        242.         return (List) getHibernateTemplate().execute(new HibernateCallback(){   
        243.             public Object doInHibernate(Session session) throws HibernateException, SQLException {   
        244.                 Criteria c = dc.getExecutableCriteria(session);   
        245.                    
        246.                 page.setTotalCount(((Integer) c.setProjection(Projections.rowCount()).uniqueResult()).intValue());    
        247.                 c.setProjection(null);    
        248.                 c.setResultTransformer(Criteria.ROOT_ENTITY);   
        249.                 c.setFirstResult(page.getBeginIndex());   
        250.                 c.setMaxResults(page.getPageSize());   
        251.                 return c.list();   
        252.             }   
        253.         }, true);   
        254.     }   
        255.   
        256. 其中的參數true表示要Spring強制傳入SessionImpl,而不是傳入Proxy代理類,page.setTotalCount(((Integer) c.setProjection(Projections.rowCount()).uniqueResult()).intValue());    
        257. c.setProjection(null); 目的是為了獲得行數,并設置投影為空,為的是返回List出來,如果不設置setProjection(null)的話,c.list將返回的是行數(int型),而不是所要查詢的數據庫信息。但是Criteria的ResultTransformer會變成PassThroughResultTransformer,criteria.list的時候可能結果會跟理想的不一樣。所以我們還要再c.setResultTransformer(Criteria.ROOT_ENTITY);把結果以Entity的形式返回,而不是Object[]的形式返回。具體的ResultTransformer可以google一下。   
        258.   
        259. 測試代碼如下:   
        260.   
        261.     public void testCriteria() {   
        262.         DetachedCriteria dc = DetachedCriteria.forClass(User.class);   
        263.         dc.add(Restrictions.eq("name""user")).add(Restrictions.like("description""%主管人員%"));   
        264.         IPage page = new Page();   
        265.         page.setCurrentPage(1);   
        266.         page.setPageSize(10);   
        267.         Collection list = _userDAO.findCriteria(dc, page);   
        268.         assertNotNull(list);   
        269.         assertEquals(1, list.size());   
        270.     }   
        271.   
        272. 來源:http://aimtime812110.spaces.msn.com/Blog/cns!1pXyGS-D6ufSs-1GPdk-fkiQ!108.entry   


        273. posted on 2007-10-11 22:13 Ke 閱讀(581) 評論(0)  編輯  收藏 所屬分類: hibernate
          主站蜘蛛池模板: 天柱县| 龙岩市| 高邮市| 永福县| 山西省| 冀州市| 孟村| 名山县| 许昌市| 凤冈县| 上饶县| 泾源县| 胶南市| 龙山县| 资阳市| 周至县| 景宁| 镇康县| 苏尼特右旗| 穆棱市| 伊川县| 鄱阳县| 德安县| 大连市| 盐亭县| 田林县| 庐江县| 太原市| 保亭| 广水市| 伊通| 休宁县| 屏山县| 泊头市| 肇庆市| 锡林郭勒盟| 高清| 富川| 长治市| 乌审旗| 长丰县|