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中 传到前台。
        }

  • 相关阅读:
    Android Studio 开发
    Jsp编写的页面如何适应手机浏览器页面
    电影
    Oracle 拆分列为多行 Splitting string into multiple rows in Oracle
    sql server 2008 自动备份
    WINGIDE 激活失败
    python安装 错误 “User installations are disabled via policy on the machine”
    ble编程-外设发送数据到中心
    iOS开发-NSString去掉所有换行及空格
    ios9 字符串与UTF-8 互相转换
  • 原文地址:https://www.cnblogs.com/cunkouzh/p/5418789.html
Copyright © 2011-2022 走看看