[Hibernate]Hibernate的QBC查詢

QBC查詢(Criteria查詢接口)
1. QBC:Query By Criteria    -- 按條件進行查詢(如果查詢包含查詢條件,推薦使用QBC進行查詢)
2. QBC基本查詢:
    * 先創建查詢的接口
        * Criteria c = session.createCriteria(User.class);
    * 設置查詢的條件
        * criteria.add(Restrictions.gt("age", 10));
    * 查詢數據
        * List<User> list = criteria.list();

3.排序查詢

   *需要使用addOrder()的方法來設置參數,參數使用org.hibernate.criterion.Order對象

   *具體代碼如下:   

        Criteria criteria =session.createCriteria(Linkman.class);
        criteria.addOrder(Order.desc("lkm_id")); // 設置排序
        List<Linkman> list = criteria.list();
        for (Linkman linkman : list) {
            System.out.println(linkman);
        }

4.分頁查詢

   * QBC的分頁查詢需使用兩個方法

        * setFirstResult();

        * setMaxResults(); 

example:

        Criteria criteria =session.createCriteria(Linkman.class);
        criteria.setFirstResult(0);
        criteria.setMaxResults(3);
        List<Linkman> list =criteria.list();
        for (Linkman linkman : list) {
            System.out.println(linkman);
        }

5.條件查詢(Criterion是查詢條件的接口,Restrictions類是Hibernate框架提供的工具類,使用該工具類來設置查詢條件)

   *條件查詢使用Criteria接口的add方法,用來傳入條件。

   *使用Restrictions的添加條件的方法,來添加條件:

        * Restrictions.eq           --相等

        * Restrictions.gt            --大於號

        * Restrictions.ge           --大於等於

        * Restrictions.lt              --小於

        * Restrictions.le             --小於等於

        * Restrictions.between      --在之間

        * Restrictions.like          --模糊查詢

        * Restrictions.in             --範圍

        * Restrictions.and         --並且

        * Restrictions.or             --或者

 example:

        Criteria criteria =session.createCriteria(Linkman.class);
        // 設置查詢條件
        criteria.add(Restrictions.or(Restrictions.eq("lkm_gender","男"), Restrictions.gt("lkm_id", 3L)));
        List<Linkman> list =criteria.list();
        for (Linkman linkman : list) {
            System.out.println(linkman);
        }

表達式用法:

Restrictions.isNull("email");

Restrictions.isNotNull("email");   

Restrictions.isEmpty("bids");   

Restrictions.sizeGe("bids", 3);//bids屬性大小

6.聚合函數查詢

   * 使用Projection(投影)接口,ProjectionsHibernate提供的工具類,使用該工具類設置聚合函數查詢

   *需要使用.setProjection()方法

      與Restrictions類相似,Projections類提供了幾個用來獲取Projection實例的靜態工廠方法。在獲得Projection對象之後,使用setProjection()方法將它添加到Criteria對象中。       注意,返回的結果集是Object類型,需要對結果進行適當的類型轉換。

     ① avg(String propertyName):計算屬性字段的平均值。
     ② count(String propertyName):統計一個屬性在結果中出現的次數。
     ③ countDistinct(String propertyName):統計屬性包含的不重複值的數量。
     ④ max(String propertyName):計算屬性值的最大值。
     ⑤ min(String propertyName):計算屬性值的最小值。
     ⑥ sum(String propertyName):計算屬性值的總和。

   *具體的代碼如下

        Criteria criteria =session.createCriteria(Linkman.class);
        criteria.setProjection(Projections.rowCount());
        List<Number> list =criteria.list();
        Long count = list.get(0).longValue();
        System.out.println(count);

注意:

        *criteria.setProjection(Projections.sum("cust_id"));多次設置該方法,默認會覆蓋!

        *解決覆蓋的問題:ProjectionList projectionList =Projections.projectionList();向集合中添加聚合函數的設置

example:

     Criteria criteria = getSession().createCriteria(Product.class); 
     ProjectionList projList = Projections.projectionList(); 
     projList.add(Projections.max("price")); 
     projList.add(Projections.min("price")); 
     projList.add(Projections.avg("price")); 
     projList.add(Projections.countDistinct("description")); 
     criteria.setProjection(projList);

7. 分組查詢  --Projections.groupProperty("屬性名")

   ProjectionList projectionList = Projections.projectionList();
   projectionList.add(Projections.rowCount());
   projectionList.add(Projections.groupProperty("cust_name"));
   c.setProjection(projectionList);

添加一個投影到一個投影列表中時 也可以爲它指定一個別名:

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" )
) .list();



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章