轉自:http://blog.sina.com.cn/s/blog_67b9ad8d01010by1.html
以前用sql實現聯合查詢 是非常簡單的事,只需要寫sql語句就可以,第一次遇到hibernate要實現多表聯合查詢的時候還楞了一下。最后看了下資料,才恍然大悟,hibernate實現多表聯合查詢跟SQL沒多大差別。
hibernate很多實現都是靠喜歡配關系,但是如果兩張表,數據量都非常大的時候,並不合適配關系。
例如:student表和score表需要做聯合查詢。
1)sql: select s.id,s.name,sc.score from student as s,score as sc where s.id = sc.userId;
(字段都是用的數據庫中字段名稱)
2)HQL: select s.id,s.name,sc.score from Student as s,Score as sc where s.id = sc.userId;
(上面字段都是 javabean的屬性)
如果我們按1)查詢的話,必須調用 session.createSQLQuery();方法
如果按2)查詢,還是調用 session.createQuery();
只是要注意,平時我們查詢的時候,例如:“from Student ”查詢的結果集 封裝的全都是student對象,但是2)執行的結果集里面不是對象,而是一系列數組。需要轉換成需要的樣式。
下面 是查詢的一段代碼:
Session session = getHibernateTemplate().getSessionFactory() .getCurrentSession(); StringBuffer sb = new StringBuffer(" select user.username,user.truename,user.sex,user.idnum,user.level,s.sumScore from Score as s,Examuseras user where s.id.userId = user.id "); if(score != null){ if(score.getExamId()!=null && !"".equals(score.getExamId()) && !"null".equals(score.getExamId())){ sb.append(" and s.examId =:examId "); } if(score.getExamPlace()!=null && !"".equals(score.getExamPlace()) && !"null".equals(score.getExamPlace())){ sb.append(" and s.examPlace =:examPlace "); } if(score.getUsername()!=null && !"".equals(score.getUsername()) && !"null".equals(score.getUsername())){ sb.append(" and s.username like:username "); } } sb.append(" order by s.sumScore desc "); Query q = session.createQuery(sb.toString()); if(score != null){ if(score.getExamId()!=null && !"".equals(score.getExamId()) && !"null".equals(score.getExamId())){ q.setParameter("examId",score.getExamId()); } if(score.getExamPlace()!=null && !"".equals(score.getExamPlace()) && !"null".equals(score.getExamPlace())){ q.setParameter("examPlace",score.getExamPlace()); } if(score.getUsername()!=null && !"".equals(score.getUsername()) && !"null".equals(score.getUsername())){ q.setParameter("username","%"+score.getUsername()+"%"); } } List list = q.list(); 需要將查詢的結果集 進行一下轉換: 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中 傳到前台。 }
