posts - 30, comments - 5, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          搜索

          •  

          最新評論

          hibernate中Criteria的用法示例

          Posted on 2010-05-04 14:07 無所謂 閱讀(943) 評論(1)  編輯  收藏 所屬分類: Hibernate

          hibernate支持一種java編寫習(xí)慣的查詢api,使用session建立net.sf.hibernate.Criteria,您可以在不用sql甚至hql的情況下進(jìn)行查詢。
               如果我們要查詢User的所有信息我們可以如下使用Criteria:

          Criteria crit = session.createCriteria(User.class);
                  List users 
          = crit.list();
                  
          for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) {
                      User user 
          = (User) iterator.next();
                      System.out.println(
          "name: " + user.getName());
                      System.out.println(
          "age: " + user.getAge());           
                  }


          我們要為查詢限定條件,可以通過net.sf.hibernate.expression.Expression設(shè)置Expression有很多的條件查詢方法下面舉一些例子:

          Criteria crit = session.createCriteria(User.class);
                  crit.add(Expression.ge(
          "age"new Integer(25)));
                  List users 
          = crit.list();


          ge()表示大于等于,即age大于等于25的user。

          crit.add(Expression.gt("age"new Integer(20)));
          crit.add(Expression.between(
          "weight"new Integer(60),new Integer(80)));
          List users 
          = crit.list();


          between表示weight在60和80之間。

          crit.add(Expression.or(
                             Expression.eq(
          "age"new Integer(20)),
                             Expression.isNull(
          "age")
                         ));
          List users 
          = crit.list();


          eq表示age為20的user。

          Criteria crit = session.createCriteria(User.class);
          crit.setFirstResult(
          51);
          crit.setMaxResult(
          50);
          List users 
          = crit.list();

           

          setMaxResult()設(shè)置返回的信息條數(shù),setFirstResult()設(shè)置查詢結(jié)果的初始位置,上面的程序段可以實(shí)現(xiàn)分頁。

           

          在hibernate的Session里面使用createCriteria可以創(chuàng)建一個Criteria實(shí)例幫助我們進(jìn)行條件查詢,不用自己串hql語句,很方便。
          用法很簡單,首先傳Class實(shí)例創(chuàng)建Criteria,Class實(shí)例對應(yīng)你想要查詢的那個實(shí)體:

          Criteria c = session.createCriteria(Person.class);


          然后調(diào)用Criteria的add方法加入條件(Restrictions)。常用的條件有:
           
          方法說明: Restrictions.eq 等于 
                               Restrictions.allEq 使用Map,使用key/value進(jìn)行多個等于的對比
                               Restrictions.gt 大于 >
                               Restrictions.ge 大于等于 >=
                               Restrictions.lt 小于 <
                              Restrictions.le 小于等于 <=
                              Restrictions.between 對應(yīng)SQL的BETWEEN子句
                              Restrictions.like 對應(yīng)SQL的LIKE子句
                              Restrictions.in 對應(yīng)SQL的in子句
                              Restrictions.and   and關(guān)系
                               Restrictions.or   or關(guān)系
                             Restrictions.sqlRestriction    SQL限定查詢 


          例如,我想返回Person實(shí)體里面年齡(age)大于20的記錄,那么就為Criteria加入Restrictions.gt條件:

          List list = c.add(Restrictions.gt(“age”,new Integer(20))).list();


           
          Restrictions.and和Restrictions.or很有用,表示and查詢還是or查詢,例如我要查詢Person實(shí)體里面年齡(age)大于20,或者性別 (sex)為man
          的記錄,那么就為Criteria加入:

          List list = c.add(Restrictions.or(
          Restrictions.gt(“age”,
          new Integer(20)),
          Restrictions.eq(“sex”,”man”)
          )).list();
           


          如果需要關(guān)聯(lián)查詢的話,可以使用Criteria的createCriteria方法創(chuàng)建一個Criteria,例如部門(Department)和人員(Person)是一對多的關(guān)系,我要查詢Person實(shí)體里面年齡(age)大于20,性別 (sex)為man,
          備注包含應(yīng)屆生,
          且所在部門(department)是開發(fā)部的記錄:

          List list = c.add(Restrictions.gt(“age”,  new Integer(20)))
          .add(Restrictions.eq(“sex”,”man”))
          .add(Restrictions.like(“Memo”,”
          %應(yīng)屆生%”))
          .createCriteria(“department”)
          .add(Restrictions.eq(“departmentname”,”開發(fā)部”))
          .list();


           
          其他條件的用法也很簡單,就不列舉了。
           
          另外,Hibernate3出了一個org.hibernate.criterion.DetachedCriteria,即離線Criteria,它允許你可以先創(chuàng)建DetachedCriteria,然后傳到Session里面才真正返回一個Criteria,用法如下:

           
          DetachedCriteria detchedCriteria 
          = DetachedCriteria.forClass(Person.class); // 先建立DetchedCriteria物件
          detchedCriteria.add(Restrictions.ge("age",new Integer(25)));    // 加入查詢條件
          Session session = sessionFactory.openSession();
          Criteria criteria 
          = detchedCriteria.getExecutableCriteria(session);    // 綁定Session並返回一個Criteria實(shí)例List list = criteria.list(); 


           
           
          最后,需要注意,Criteria還提供了setFirstResult和setMaxResults方法進(jìn)行分頁查詢。
           


          評論

          # re: hibernate中Criteria的用法示例[未登錄]  回復(fù)  更多評論   

          2010-05-04 22:42 by fw
          Expression和Restrictions的區(qū)別呢?
          主站蜘蛛池模板: 扶余县| 南川市| 盘锦市| 木兰县| 湖州市| 鄄城县| 平安县| 灵璧县| 平顺县| 堆龙德庆县| 阳江市| 正安县| 高雄市| 嘉义县| 临江市| 家居| 准格尔旗| 辽宁省| 石柱| 称多县| 麻江县| 邻水| 庆安县| 方正县| 饶河县| 册亨县| 枞阳县| 板桥市| 沂南县| 金华市| 广东省| 沧州市| 商水县| 神木县| 辽中县| 新民市| 克山县| 柳州市| 灌阳县| 金堂县| 澄江县|