您的位置:首页 > 其它

hql多表关联查询

2016-05-02 14:18 225 查看

hibernate实现多表联合查询

以前用sql实现联合查询是非常简单的事,只需要写sql语句就可以,第一次遇到hibernate要实现多表联合查询的时候还楞了一下。最后看了下资料,才恍然大悟,hibernate实现多表联合查询跟SQL没多大差别。  

   hibernate很多实现都是靠喜欢配关系,但是如果两张表,数据量都非常大的时候,并不合适配关系。

   例如:student表和score表需要做联合查询。

    1)sql:select s.id,s.name,sc.score from student ass,score as sc where s.id = sc.userId;

   (字段都是用的数据库中字段名称)

    2)HQL:select s.id,s.name,sc.score from Student ass,Score as sc where s.id = sc.userId;

    (上面字段都是javabean的属性)

    如果我们按1)查询的话,必须调用 session.createSQLQuery();方法

    如果按2)查询,还是调用 session.createQuery();

    只是要注意,平时我们查询的时候,例如:“from Student ”查询的结果集封装的全都是student对象,但是2)执行的结果集里面不是对象,而是一系列数组。需要转换成需要的样式。

下面 是查询的一段代码:

Session session =getHibernateTemplate().getSessionFactory()

   .getCurrentSession();

   StringBuffersb = new StringBuffer(" selectuser.username,user.truename,user.sex,user.idnum,user.level,s.sumScorefrom
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
4000
".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();

    StudentScorest;

    for(inti = 0; i < stuList.size();i++){

     st= new StudentScore();

     Object[]object = (Object[])stuList.get(i);//每行记录不在是一个对象 而是一个数组
     StringuserId =  (String)object[0];

     Stringusername =  (String)object[1];

     Stringtruename =  (String)object[2];

     Stringsex =  (String)object[3];

     Stringidnum =  (String)object[4];

     Stringlevel =  (String)object[5];

     DoublesumScore = Double.parseDouble(String.valueOf(object[6]));

     StringpaperId =  (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中 传到前台。

    }

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: