以前用sql實現(xiàn)聯(lián)合查詢 是非常簡單的事,只需要寫sql語句就可以,第一次遇到hibernate要實現(xiàn)多表聯(lián)合查詢的時候還楞了一下。最后看了下資料,才恍然大悟,hibernate實現(xiàn)多表聯(lián)合查詢跟SQL沒多大差別。
hibernate很多實現(xiàn)都是靠喜歡配關(guān)系,但是如果兩張表,數(shù)據(jù)量都非常大的時候,并不合適配關(guān)系。
例如:student表和score表需要做聯(lián)合查詢。
1)sql: select s.id,s.name,sc.score from student as s,score as sc where s.id = sc.userId;
(字段都是用的數(shù)據(jù)庫中字段名稱)
2)HQL: select s.id,s.name,sc.score from Student as s,Score as sc where s.id = sc.userId;
(上面字段都是 javabean的屬性)
如果我們按1)查詢的話,必須調(diào)用 session.createSQLQuery();方法
如果按2)查詢,還是調(diào)用 session.createQuery();
只是要注意,平時我們查詢的時候,例如:“from Student ”查詢的結(jié)果集 封裝的全都是student對象,但是2)執(zhí)行的結(jié)果集里面不是對象,而是一系列數(shù)組。需要轉(zhuǎn)換成需要的樣式。
下面 是查詢的一段代碼:
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,Examuser as 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();
需要將查詢的結(jié)果集 進行一下轉(zhuǎn)換:
List stuList = scoreService.findAllScore(queryScore, null); // 返回的結(jié)果集
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);// 每行記錄不在是一個對象 而是一個數(shù)組
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中 傳到前臺。
}