1. 程式人生 > >hql查詢結果的處理

hql查詢結果的處理

 1、單表查詢

 //1、建立一個Query物件  
            //引數:需要執行的hql語句  
            String hql = "select e from Employee e where id = 1";  
            Query query = session.createQuery(hql);  
            //2、執行查詢  
            //2、1封裝所有  
            List<Employee> emp = query.list();  
            for(Employee e : emp){  
                System.out.println(e);  
  }  

//2、2 封裝一個(第一個)  
            Employee empl = (Employee)query.uniqueResult();  
            System.out.println(empl);

*  1)單表查詢  
//       1.1 全表查詢  
//            String hql = "from star.july.d_hql.Employee";    
//          String hql = "select e from Employee e";  
              
//       1.2 指定欄位查詢  
            //返回物件陣列  
//          String hql = "select e.name,e.title from Employee e";  
              
//       1.3 排除重複記錄  
//          String hql = "select distinct(e.gender) from Employee e";  
              
//       1.4 條件查詢(重點)(where)  
            //邏輯條件:and  or  
            // 模糊查詢:like: % _  
            //比較查詢: < > <= >= between and <>  
            //判空查詢: is null ,is not null, ='',<>'';  
//          String hql = "select e from Employee e where name like '張%'";  
//          String hql = "select e from Employee e where e.gender is null or e.gender=''";  
              
//       1.5 分頁查詢  
          String hql = "from Employee "; 
            Query query = session.createQuery(hql); 
            //設定開始讀取行 
            query.setFirstResult(0); 
            //每頁讀取多少條資訊 
            query.setMaxResults(3);
              
//        1.6 聚合查詢  
            //avg,count,max,min,uniqueResult  
//          String hql = "select max(e.salary) from Employee e";  
              
//        1.7 查詢排序  
            //order by  
            //desc:降序  asc:升序  
//          String hql = "select e from Employee e order by id desc ";  
              
              
//        1.8 分組查詢  
//          String hql = "select e from Employee e group by e.gender";  
          
//        1.9 分組後篩選  
            String hql = "select e from Employee e  where e.gender is not null and e.gender<>'' group by e.gender having count(e.gender)>1";  
              
            Query query = session.createQuery(hql); 


  //集合物件  
            List<Object> e = query.list();  
            for(Object emp : e){  
                System.out.println(emp);  
            }  

            //物件陣列  
         List<Object[]> objects = query.list(); 
            for(Object[] object : objects){ 
                for(Object obj:object ){ 
                System.out.print(obj); 
                } 
                System.out.println(); 
            } 

    //封裝一個物件  
            Object unique = query.uniqueResult(); 
            System.out.println(unique);     

2、多表查詢

    //多表查詢  
        @Test  
        public void test2(){  
            Session session = HibernateUtil.getSession();  
            Transaction ts = session.getTransaction();  
            try{  
                ts.begin();  
                  
                /** 
                 *步驟 
                 *1、確定查詢哪些物件 
                 *2、確定查詢哪些屬性 
                 *3、確定連線條件 
                 *4、業務條件  
                 */  
                //1、內連線查詢  
                //效果:只有滿足條件的資料才會被顯示出來  
                //查詢員工及其部門:顯示員工名稱,部門名稱  
//              String hql = "select e.name,d.deptName from Employee e , Dept d where e.dept.id=d.id";  
                //另一種寫法  
//              String hql = "select e.name,d.deptName from Employee e inner join e.dept d";  
                  
                  
                //左外連線  
                //效果:優先顯示左表,右表的資料匹配顯示,不匹配則顯示null  
                //查詢所有部門的員工(沒有員工的部門也要顯示出來)  
                String hql = "select d.deptName, e.name from Dept d left outer join d.employee e";  
                  
                //右外連線  
//              String hql = "select d.deptName,e.name from Employee e right outer join e.dept d";  
                Query query = session.createQuery(hql);  
                  
                /*List<Object>  object = query.list(); 
                for(Object obj:object){ 
                    System.out.println(obj); 
                }*/  
                  
                List<Object[]> objects = query.list();  
                for(Object[] object:objects){  
                    for(Object obj : object){  
                        System.out.print(obj);  
                    }  
                    System.out.println();  
                }   
                ts.commit();  
                  
            }catch(Exception e){  
                e.printStackTrace();  
                ts.rollback();  
            }  
        }

 3、實現多表連線查詢,且查詢結果集不與任何一個實體類對應,怎麼解決呢?

舉個栗子:
現在有兩個表,一個users使用者表, 一個goods商品表,每個使用者可以有多個商品,而一個商品只能對應一個使用者。
users表中的欄位:userId,userName,telephone,address
goods表中的欄位:goodsId,goodsName,userId
現在要實現兩表連線查詢,查出每個使用者所擁有的商品,並把該使用者的資訊和其商品資訊顯示出來。
使用Hibernate反向生成的實體類分別是Users和Goods。
有兩種方式:
(1)使用傳統方式:
String hql="select u.userName, u.telephone, u.address, g.goodsName from Users u, Goods g where u.userId=g.userId";

根據這個查詢語句,呼叫query.list()方法得到一個List值,這個List中的每一個值都是Object[]型別的,裡面包含了查詢出來的所有值,剩下的自個兒去處理就行了

例如:需要將查詢的結果集 進行一下轉換:

List stuList = scoreService.findAllScore(queryScore, null); // 返回的結果集    if(stuList != null && stuList.size()>0){     list = new LinkedList();     StudentScore st;     for(int i = 0; i < stuList.size();i++){      st = new StudentScore();      Object[] object = (Object[])stuList.get(i);// 每行記錄不在是一個物件 而是一個數組      String userId =  (String)object[0];      String username =  (String)object[1];      String truename =  (String)object[2];      String sex =  (String)object[3];      String idnum =  (String)object[4];      String level =  (String)object[5];      Double sumScore =  Double.parseDouble(String.valueOf(object[6]));      String paperId =  (String)object[7];      // 重新封裝在一個javabean裡面      st.setUserId(userId);      st.setUsername(username);      st.setTruename(truename);      st.setIdnum(idnum);      st.setLevel(DictSwitch.getValue("DICT_LEVEL",level));      st.setSex(DictSwitch.getValue("DICT_SEX",sex));      st.setPaperId(paperId);      st.setSumScore(sumScore);      st.setExamplace(DictSwitch.getValue("DICT_EXAMSTATION",examplace));      list.add(st); // 最終封裝在list中 傳到前臺。     }

(2)增加一個對映類

增加一個對映類UsersVoGoods.java,新增需要查詢的資訊相關的所有屬性,本例中新增userName, telephone, address, goodsName。併為這幾個屬性新增setter和getter方法,增加建構函式,引數與這四個屬性對應,那麼可以用hql查詢方式:

String hql = "select new com.test.UsersVoGoods(u.userName, u.teltphone, u.address, g.goodsName) from Users u, Goods g where u.userId=g.userId";

query.list()的返回值List中的值都是UsersVoGoods型的,直接使用get()就能獲取。

其實不增加對映類也是可以的,只需要在Users.java實體類裡增加一個建構函式,函式引數還是需要的所有欄位,併為這些引數中Users實體原來沒有的欄位新增屬性和getter() setter()即可。