转自: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)执行的结果集里面不是对象,而是一系列数组。需要转换成需要的样式。

下面 是查询的一段代码:

  1. Session session = getHibernateTemplate().getSessionFactory()
  2. .getCurrentSession();
  3. 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 ");
  4. if(score != null){
  5. if(score.getExamId()!=null && !"".equals(score.getExamId())
  6. && !"null".equals(score.getExamId())){
  7. sb.append(" and s.examId =:examId ");
  8. }
  9. if(score.getExamPlace()!=null && !"".equals(score.getExamPlace())
  10. && !"null".equals(score.getExamPlace())){
  11. sb.append(" and s.examPlace =:examPlace ");
  12. }
  13. if(score.getUsername()!=null && !"".equals(score.getUsername())
  14. && !"null".equals(score.getUsername())){
  15. sb.append(" and s.username like:username ");
  16. }
  17. }
  18. sb.append(" order by s.sumScore desc ");
  19. Query q = session.createQuery(sb.toString());
  20. if(score != null){
  21. if(score.getExamId()!=null && !"".equals(score.getExamId())
  22. && !"null".equals(score.getExamId())){
  23. q.setParameter("examId",score.getExamId());
  24. }
  25. if(score.getExamPlace()!=null && !"".equals(score.getExamPlace())
  26. && !"null".equals(score.getExamPlace())){
  27. q.setParameter("examPlace",score.getExamPlace());
  28. }
  29. if(score.getUsername()!=null && !"".equals(score.getUsername())
  30. && !"null".equals(score.getUsername())){
  31. q.setParameter("username","%"+score.getUsername()+"%");
  32. }
  33. }
  34. List list = q.list();
  35. 需要将查询的结果集 进行一下转换:
  36. List stuList = scoreService.findAllScore(queryScore, null); // 返回的结果集
  37. if(stuList != null && stuList.size()>0){
  38. list = new LinkedList();
  39. StudentScore st;
  40. for(int i = 0; i < stuList.size();i++){
  41. st = new StudentScore();
  42. Object[] object = (Object[])stuList.get(i);// 每行记录不在是一个对象 而是一个数组
  43. String userId = (String)object[0];
  44. String username = (String)object[1];
  45. String truename = (String)object[2];
  46. String sex = (String)object[3];
  47. String idnum = (String)object[4];
  48. String level = (String)object[5];
  49. Double sumScore = Double.parseDouble(String.valueOf(object[6]));
  50. String paperId = (String)object[7];
  51. // 重新封装在一个javabean里面
  52. st.setUserId(userId);
  53. st.setUsername(username);
  54. st.setTruename(truename);
  55. st.setIdnum(idnum);
  56. st.setLevel(DictSwitch.getValue("DICT_LEVEL",level));
  57. st.setSex(DictSwitch.getValue("DICT_SEX",sex));
  58. st.setPaperId(paperId);
  59. st.setSumScore(sumScore);
  60. st.setExamplace(DictSwitch.getValue("DICT_EXAMSTATION",examplace));
  61. list.add(st); // 最终封装在list中 传到前台。
  62. }

 

版权声明:本文为yadongliang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/yadongliang/p/8949558.html