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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM