hibernate -- Criteria查詢


項目中用到了criteria的查詢方式,覺得挺好用的,下班后找了一下資料,一邊測試,一邊在博客上面記錄下來

如何使用

查所有

  /**
     * 作用:查所有
     * 說明:通過list(),返回的是實體對象集合
     */
    @Test
    public void test1(){
        //創建連接
        Session session = HibernateUtil.getCurrentSession();
        //開啟事務
        Transaction tx = session.beginTransaction();
        //創建criteria 
        Criteria criteria = session.createCriteria(User.class, "u");
        //業務
        List<User> list = criteria.list();
        for (User user : list) {
            System.out.println(user);
        }
        //關閉事務
        session.close();
    }

條件查詢

  1)一個條件

/**
     * 作用:or()用法
     * 說明:通過or()返回的是實體對象集合
     *      add(Criterion criterion)用來添加查詢條件
     *      Restrictions通過內置的靜態方法,可以創建criterion
     */
//創建criteria 
        Criteria criteria = session.createCriteria(User.class, "u");
        //業務:查詢出id為1或為2的用戶
        List<User> list = criteria.add(Restrictions.or(Restrictions.eq("id", 1),
                                     Restrictions.eq("id", 2) ))
                                    .list();

  2)多個條件

  /**
     * 作用:多個條件:like()和gt()的用法
     */
//創建criteria 
        Criteria criteria = session.createCriteria(User.class, "u");
        //業務:查詢出id大於1,名字中帶ji的用戶
        List<User> list = criteria.add(Restrictions.like("name","%ji%"))
                                  .add(Restrictions.gt("id", 1))
                                  .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關系

排序

  /**
     * 作用:排序
     * 說明:通過addOrder()添加排序條件
     *         Order設置排序規則,desc是降序,asc是升序
     */
//創建criteria 
        Criteria criteria = session.createCriteria(User.class, "u");
        //業務:對查詢結果,根據id排序
        List<User> list = criteria.addOrder(Order.desc("id"))
                                   .list();

關聯

參考 : http://blog.csdn.net/bestlxm/article/details/6735464   

User實體類中有關系屬性orders,

數據庫中的數據如下:order表中的外鍵是user_id

  user表:

     order表:

代碼如下:

/**
     * 作用:關聯
     * 說明:通過createAlias()設置關系屬性
     *     對已定義關聯關系的,我們可以使用createAlias()來創建屬性的別名,然后引用別名進行條件查詢,如:
                     這樣進行查詢時就可得到關聯查詢后的Parent對象結果集,本例中,User是Parent類
     *         
     * Hibernate打印sql語句如下:
     *  select
            this_.id as id0_1_,
            this_.age as age0_1_,
            this_.birth as birth0_1_,
            this_.name as name0_1_,
            o1_.id as id1_0_,
            o1_.note as note1_0_,
            o1_.price as price1_0_ 
        from
            user50 this_ 
        inner join
            order50 o1_ 
         on this_.id=o1_.user_id 
        where
            o1_.id = ?
            
     * 控制台打印如下:
     * User [userID=1, name=zhangjifeng, age=18, birthday=2016-07-26]
     */
    @Test
    public void test5(){
        //創建連接
        Session session = HibernateUtil.getCurrentSession();
        //開啟事務
        Transaction tx = session.beginTransaction();
        //創建criteria 
        Criteria criteria = session.createCriteria(User.class, "u");
        //業務:
        List<User> list = criteria.createAlias("orders","o")
                                   .add(Restrictions.eq("o.id", 1))
                                   .list();
        for (User user : list) {
            System.out.println(user);
        }
        
        //關閉事務
        session.close();
    }

關聯2:createCriteria()

測試代碼如下

  /**
     * 第二個createCriteria(),返回的是一個新的實例
     * 打印出user和order
     */
    @Test
    public void test6(){
        //創建連接
        Session session = HibernateUtil.getCurrentSession();
        //開啟事務
        Transaction tx = session.beginTransaction();
        //創建criteria 
        Criteria criteria = session.createCriteria(User.class, "u");
        //業務:
        List list = criteria.createCriteria("orders","o")
                                   .add(Restrictions.eq("o.id", 1))
                                   .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP)
                                   .list();
        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            Map map = (Map)iterator.next();
            
//            Set keySet = map.keySet();
            
            Set entrySet = map.entrySet();
            Iterator iterator2 = entrySet.iterator();
            while(iterator2.hasNext()){
                Map.Entry<String, Object> map1 =(Entry<String, Object>) iterator2.next();
                System.out.println(map1.getValue());
            }
        }
        //關閉事務
        session.close();
    }

Projections投影

   1)將結果集中的結果當做行和列集來使用,這與通過JDBC執行select查詢獲得的數據的使用方式相似。因此,Hibernate也支持屬性、統計函數和Group By等查詢。

   2)要想使用Hibernate的投影統計功能,首先要從org.hibernate.criterion.Projections工廠類獲得org.hibernate.criterion.Projection對象

   3)Hibernate的Projections工廠類包含了以下幾個常用的統計函數:

    ① avg(String propertyName):計算屬性字段的平均值。

    ② count(String propertyName):統計一個屬性在結果中出現的次數。

    ③ countDistinct(String propertyName):統計屬性包含的不重復值的數量。

    ④ max(String propertyName):計算屬性值的最大值。

    ⑤ min(String propertyName):計算屬性值的最小值。

    ⑥ sum(String propertyName):計算屬性值的總和。

代碼如下:

/**
     * 投影:Projections
     * 統計,重復
     */
    @Test
    public void test8(){
        //創建連接
        Session session = HibernateUtil.getCurrentSession();
        //開啟事務
        Transaction tx = session.beginTransaction();
        //創建criteria 
        Criteria criteria = session.createCriteria(Order.class, "o");
        //業務:
        List<Object[]> list = criteria.setProjection(Projections.projectionList()
                                           .add(Projections.max("price"))
                                           .add(Projections.min("price"))
                                           .add(Projections.avg("price"))
                                           .add(Projections.countDistinct("note")) )
                             .list();
        for (Object[] objects : list) {
            for (Object object : objects) {
                System.out.println(object);
            }
        }
        //關閉事務
        session.close();

獲得的結果是單獨的屬性而不是實體類。例如,一個產品表中包含有很多字段,我們想要獲取產品表中的名稱和描述,而不需要將完整的實體加載到內存中

  /**
     * 投影:Projections
     * 獲取部分字段
     */
    @Test
    public void test9(){
        //創建連接
        Session session = HibernateUtil.getCurrentSession();
        //開啟事務
        Transaction tx = session.beginTransaction();
        //創建criteria 
        Criteria criteria = session.createCriteria(Order.class, "o");
        //業務:
        ProjectionList projList = Projections.projectionList(); 
        projList.add(Projections.property("name")); 
        projList.add(Projections.property("price")); 
        criteria.setProjection(projList); 
        List result = criteria.list(); 
        for (Object object : result) {
            System.out.println(object);
        }
        //關閉事務
        session.close();
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM