1. 程式人生 > >菜鳥先飛之HQL語句的運用

菜鳥先飛之HQL語句的運用

HQL語句

概述

 HQL是Hibernate Query Language的縮寫,提供更加豐富靈活、更為強大的查詢能力;HQL更接近SQL語句查詢語法。

用法

 使用經典的的資料庫表關係模型學生選課:student(學生表)、course(課表)、sc(成績表)

1) FROM子句的使用

 from子句的查詢可以使用全限定名進行查詢,也可以使用別名進行查詢。

/**  
    * @Title: testFrom  
    * @Description: from子句的使用
    * @throws  
    */  
    @Test
    public void testFrom() {
        // 使用全限定名查詢
//        String hql = "from demo.hql.domain.Student";
        
        // 查詢主體必須和持久化類保持一致
//        String hql = "from Student";
        
        // 使用別名,方便hql語句的其他部分通過別名引用該類
//        String hql = "from Student as s";
        
        // 使用別名可以不使用as關鍵字
        String hql = "from Student s";
        
        Query query = session.createQuery(hql);
        List<Student> students = query.list();
        for (Student student : students) {
            System.out.println(student);
        }
    }
2) 限定FROM子句的返回值

 以Object[]形式返回選擇的屬性

/**  
    * @Title: testSelectObjectArray  
    * @Description: 以Object[]形式返回選擇的屬性
    * @throws  
    */  
    @Test
    public void testSelectObjectArray() {
        String hql = "select s.sname,s.ssex from Student s";
        
        Query query = session.createQuery(hql);
        List<Object[]> list = query.list();
        
        for (Object[] objects : list) {
            System.out.println("name:" + objects[0] + "age:" + objects[1]);
        }
        
        // 如果返回的結果只有一個的話,就不能用Object[]來接收,否則會報錯
        /*String hql = "select s.sname from Student s";
        
        Query query = session.createQuery(hql);
        
        List<Object> list = query.list();
        for (Object object : list) {
            System.out.println("name:" + object);
        }*/
        
    }
 以List形式返回選擇的屬性

/**  
    * @Title: testSelectList  
    * @Description: 以List形式返回選擇的屬性
    * @throws  
    */  
    @Test
    public void testSelectList() {
        String hql = "select new list(s.sname,s.ssex,s.sage) from Student s";
        
        Query query = session.createQuery(hql);
        
        List<List> lists = query.list();
        for (List list : lists) {
            System.out.println("name:" + list.get(0) + " sex:" + list.get(1) + " age:" + list.get(2));
        }
    }
 以map的形式返回結果
/**  
    * @Title: testSelectMap  
    * @Description: 以map的形式返回結果
    * @throws  
    */  
    @Test
    public void testSelectMap() {
        String hql = "select new map(s.sname,s.ssex,s.sage) from Student s";
        
        Query query = session.createQuery(hql);
        
        List<Map> maps = query.list();
        // 返回結果的   key 就是查詢的順序 value 就是返回的結果
        for (Map map : maps) {
            System.out.println("name:" + map.get("0") + " sex:" + map.get("1") + " age:" + map.get("2"));
        }
        
    }
 以自定義型別返回結果
/**  
    * @Title: testSelectCustomType  
    * @Description: 以自定義型別返回結果
    * @throws  
    */  
    @Test
    public void testSelectCustomType() {
        // 自定義類中必須有相應的構造方法
        String hql = "select new Student(s.sname,s.ssex,s.sclass) from Student s";
        
        Query query = session.createQuery(hql);
        List<Student> students = query.list();
        for (Student student : students) {
            System.out.println("name:" + student.getSname() + " sex:" + student.getSsex() + " class:" + student.getSclass());
        }
        
    }
 distinct關鍵字去除重複元素
 /**  
    * @Title: testSelectDistinct  
    * @Description: 使用distinct關鍵字去除重複元素
    * @throws  
    */  
    @Test
    public void testSelectDistinct() {
        String hql = "select distinct s.sclass from Student s";
        
        Query query = session.createQuery(hql);
        List<Object> objects = query.list();
        for (Object object : objects) {
            System.out.println(object);
        }
    }
3) WHERE子句 where子句中有比較運算、範圍運算、字串匹配運算、邏輯運算、集合運算、四則運算
/**  
    * @Title: testWhere  
    * @Description: where子句
    * @throws  
    */  
    @Test
    public void testWhere() {
        /*
         * 比較運算
         * 運算子  =  <>  <  >  >=  <=
         * null 值判斷    is null/is not null
         */
        
//        String hql = "from Student s where s.sage > 20";
//        String hql = "from Student s where s.sclass <> null";
        
        /*
         * 範圍運算
         * in / not in (候選值列表)
         * between / not between  值1 and 值2
         */
        
//        String hql = "from Student s where s.sage in (20,25)";
//        String hql = "from Student s where s.sage not between 20 and 25";
        
        /*
         * 字串模式匹配
         * like關鍵字
         * 萬用字元  %:匹配任意個字元  _:匹配一個字元
         */
        
//        String hql = "from Student s where s.sname like '_二'";
//        String hql = "from Student s where s.sname like '_二%'";
        
        /*
         * 邏輯運算
         * and   or    not
         */
        
//        String hql = "from Student s where s.sname like '_二' or s.sage = 20";
        
        /*
         * 集合運算
         * is empty / is not empty  集合為空/不為空      empty ——> exists
         * member of  元素屬於集合     member of ——>  in
         */
        
//        String hql = "from Student s where s.scs is empty";
        
        /*
         * 四則運算
         *   +  -  *  /
         */
        
        String hql = "from Student s where s.sage + 2 > 21";
        
        Query query = session.createQuery(hql);
        List<Student> students = query.list();
        for (Student student : students) {
            System.out.println(student);
        }
    }
 4)ORDER BY 對查詢結果進行排序
 
/**  
    * @Title: testOrderBy  
    * @Description: order by 子句對查詢結果進行排序
    * @throws  
    */  
    @Test
    public void testOrderBy() {
//        String hql = "from Student s order by s.sage";
        String hql = "from Student s order by s.sage asc , s.sid desc";
        
        Query query = session.createQuery(hql);
        List<Student> students = query.list();
        for (Student student : students) {
            System.out.println(student);
        }
    }
 5) uniqueResult方法查詢單個物件
 
 /**  
    * @Title: testUniqueResult  
    * @Description: uniqueResult方法查詢單個物件,如果有多個結果會報錯
    * @throws  
    */  
    @Test
    public void testUniqueResult() {
        String hql = "from Student s where s.sid = 1";
        
        Query query = session.createQuery(hql);
        Student student = (Student) query.uniqueResult();
        System.out.println(student);
    }