笑看風云

          一切從頭開始
          posts - 28, comments - 1, trackbacks - 0, articles - 2

          Criteria 查詢

          Posted on 2008-07-21 21:59 笑看風云 閱讀(542) 評論(0)  編輯  收藏 所屬分類: Java
          Criteria對SQL進行封裝,讓開發人員可以用物件的方式來對資料庫進行操作,例如下面的查詢User表格中的所有資料:
          Criteria criteria = session.createCriteria(User.class);
          // 查詢user所有欄位
          List users = criteria.list();
          Iterator iterator =  users.iterator();
          System.out.println("id \t name/age");
          while(iterator.hasNext()) {
              User user = (User) iterator.next();
              System.out.println(user.getId() +
                                         " \t " + user.getName() +
                                         "/" + user.getAge());           
          }

          Hibernate實際上使用以下的SQL來查詢資料庫:
          select this_.id as id0_, this_.name as name0_0_, this_.age as age0_0_ from user this_

          Criteria實際上只是個容器,如果想要設定查詢條件,則要使用add()方法加入Restrictions的條件限制,例如查詢age大于20且小于40的資料:
          Criteria criteria = session.createCriteria(User.class);
          criteria.add(Restrictions.gt("age", new Integer(20)));
          criteria.add(Restrictions.lt("age", new Integer(40)));
          List users = criteria.list();

          您也可以使用邏輯組合來進行查詢,例如結合age等于(eq)20或(or)age為空(isNull)的條件:
          Criteria criteria = session.createCriteria(User.class);
          criteria.add(Restrictions.or(
                             Restrictions.eq("age", new Integer(20)),
                             Restrictions.isNull("age")
                         ));
          List users = criteria.list();

          也可以使用sqlRestriction()方法來提供SQL語法作限定查詢,例如查詢name以cater開頭的資料:
          Criteria criteria = session.createCriteria(User.class);
          criteria.add(Restrictions.sqlRestriction("{alias}.name LIKE (?)", "cater%", Hibernate.STRING));
          List users = criteria.list();

          其中alias將被替換為與User類別相關的名稱,而?將被替換為cater%,也就是第二個參數所提供的值,在SQL撰寫時,不必再寫WHERE,如果有多個查詢條件,例如BETWEEN子句的查詢,則可以如下:
          Criteria criteria = session.createCriteria(User.class);
          Integer[] ages = {new Integer(20), new Integer(40)};
          Type[] types = {Hibernate.INTEGER, Hibernate.INTEGER};
          criteria.add(Restrictions.sqlRestriction("{alias}.age BETWEEN (?) AND (?)", ages, types));
          List users = criteria.list();

          Restrictions的幾個常用限定查詢方法如下表所示:
          方法 說明
          Restrictions.eq 等于
          Restrictions.allEq 使用Map,使用key/value進行多個等于的比對
          Restrictions.gt 大于 >
          Restrictions.ge 大于等于 >=
          Restrictions.lt 小于 <
          Restrictions.le 小于等于 <=
          Restrictions.between 對應SQL的BETWEEN子句
          Restrictions.like 對應SQL的LIKE子句
          Restrictions.in 對應SQL的in子句
          Restrictions.and and關系
          Restrictions.or or關系
          Restrictions.sqlRestriction SQL限定查詢

          *******************************************************************************************************************************************
          您可以使用Criteria進行查詢,并使用Order對結果進行排序,例如使用Oder.asc()由小到大排序(反之則使用desc()):
          Criteria criteria = session.createCriteria(User.class);
          criteria.addOrder(Order.asc("age"));
          List users = criteria.list();

          setMaxResults()方法可以限定查詢回來的筆數,如果配合setFirstResult()設定傳回查詢結果第一筆資料的位置,就可以實現簡單的分頁,例如傳回第51筆之后的50筆資料(如果有的話):
          Criteria criteria = session.createCriteria(User.class);
          criteria.setFirstResult(51);
          criteria.setMaxResult(50);
          List users = criteria.list();

          您可以對查詢結果進行統計動作,使用Projections的avg()、rowCount()、count()、max()、min()、 countDistinct()等方法,例如對查詢結果的"age"作平均:
          Criteria criteria = session.createCriteria(User.class);
          criteria.setProjection(Projections.avg("age"));
          List users = criteria.list();
          Iterator iterator =  users.iterator();
          while(iterator.hasNext()) {
              System.out.println(iterator.next());      
          }

          還可以配合Projections的groupProperty()來對結果進行分組,例如以"age"進行分組,也就是如果資料中"age"如果有 20、20、25、30,則以下會顯示20、25、30:
          Criteria criteria = session.createCriteria(User.class);
          criteria.setProjection(Projections.groupProperty("age"));
          List users = criteria.list();
          Iterator iterator =  users.iterator();
          while(iterator.hasNext()) {
              System.out.println(iterator.next());      
          }

          如果想結合統計與分組功能,則可以使用ProjectionList,例如下面的程式會計算每個年齡各有多少個人:
          ProjectionList projectionList = Projections.projectionList();
          projectionList.add(Projections.groupProperty("age"));
          projectionList.add(Projections.rowCount());

          Criteria criteria = session.createCriteria(User.class);
          criteria.setProjection(projectionList);
          List users = criteria.list();
          Iterator iterator =  users.iterator();
          while(iterator.hasNext()) {
              Object[] o = (Object[]) iterator.next();
              System.out.println(o[0] + "\t" + o[1]);
          }

          如果有一個已知的物件,則可以根據這個物件作為查詢的依據,看看是否有屬性與之類似的物件,例如:
          User user = new User();
          user.setAge(new Integer(30));

          Criteria criteria = session.createCriteria(User.class);

          criteria.add(Example.create(user));

          List users = criteria.list();

          Iterator iterator =  users.iterator();
          System.out.println("id \t name/age");
          while(iterator.hasNext()) {
              User ur = (User) iterator.next();
              System.out.println(ur.getId() +
                                          " \t " + ur.getName() +
                                          "/" + ur.getAge());           
          }

          在這個例子中,user物件中有已知的屬性"age"為30,使用Example會自動過濾掉user的空屬性,并以之作為查詢的依據,也就是找出 "age"同為30的資料。

          Criteria可以進行復合查詢,即在原有的查詢基礎上再進行查詢,例如在Room對User的一對多關聯中,在查詢出所有的Room資料之后,希望再查詢users中"age"為30的user資料:
          Criteria roomCriteria = session.createCriteria(Room.class);
          Criteria userCriteria = roomCriteria.createCriteria("users");
          userCriteria.add(Restrictions.eq("age", new Integer(30)));
          List rooms = roomCriteria.list(); // 只列出users屬性中有user之"age"為30的Room
          Iterator iterator = rooms.iterator();

          原文地址 http://www.caterpillar.onlyfun.net/GossipCN/HibernateGossip/CriteriaAdvanced.html
                   http://www.caterpillar.onlyfun.net/GossipCN/HibernateGossip/CriteriaBasic.html
          主站蜘蛛池模板: 依兰县| 左云县| 大余县| 东明县| 益阳市| 杭锦旗| 榕江县| 交口县| 尖扎县| 屯昌县| 新巴尔虎左旗| 乐陵市| 克拉玛依市| 青浦区| 宿松县| 葫芦岛市| 萨嘎县| 三穗县| 资源县| 宁远县| 揭阳市| 琼结县| 岐山县| 修文县| 孟津县| 长海县| 永年县| 昌都县| 赫章县| 长岭县| 文昌市| 大洼县| 古蔺县| 达拉特旗| 油尖旺区| 焦作市| 镇原县| 芦溪县| 海口市| 都匀市| 大城县|