hibernate实现多表联合查询
转自: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中 传到前台。 }
作者:习惯沉淀
如果文中有误或对本文有不同的见解,欢迎在评论区留言。
如果觉得文章对你有帮助,请点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
扫码关注一线码农的学习见闻与思考。
回复"大数据","微服务","架构师","面试总结",获取更多学习资源!