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()即可。