zoukankan      html  css  js  c++  java
  • hibernate实现多表联合查询

     以前用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,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();
    需要将查询的结果集 进行一下转换:
    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中 传到前台。
        }
  • 相关阅读:
    深度聚类算法浅谈
    最优运输(Optimal Transfort):从理论到填补的应用
    《Javscript实用教程》目录
    再见,深圳~长沙,我又来啦
    vue中手写table的升降序
    Linux离线安装Python3.6.8
    Python3的threading模块 lock、Rlock的使用
    Python3的multiprocessing多进程-示例
    Python3的multiprocessing多进程-Lock、Rlock进程同步
    Python3的multiprocessing多进程-Queue、Pipe进程间通信
  • 原文地址:https://www.cnblogs.com/estellez/p/5044223.html
Copyright © 2011-2022 走看看