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

hibernate多表查询封装实体的更多相关文章

  1. Hibernate应用SQL查询返回实体类型

    Hibernate应用SQL查询返回实体类型 Hibernate使用SQL查询返回实体类型 以前,使用SQL查询,结果放在 RS 结果集中,还要去转换影射到Java类中.Hibernate中,可以自动 ...

  2. hibernate多表查询,结果封装在自己定义的一个实体类当中(在自己定义的类中增加构造函数)

    hibernate的hql查询直接返回java对象时出现问题3 向大家请教一个问题,现在有三张表,表之间没有关联,我需要将三张表里面的所有东西查询出来存储到一个新的对象中,该如何实现,使用hibern ...

  3. Java面试题:Hibernate的二级缓存与Hibernate多表查询

    我们来看两个有关Java框架之Hibernate的面试题,这是关于Hibernate的常考知识点. 1.请介绍一下Hibernate的二级缓存 解题按照以下思路来回答: (1)首先说清楚什么是缓存: ...

  4. Hibernate多表查询、查询优化策略(四)

    多表HQL private static void innerJoin(){ //sql内连接 隐式内连接 select * from A,B where b.aid = a.id // 显示内连接 ...

  5. hibernate多表查询

    一对多进行查询(用懒加载的模式) 查找区域所对应的街道: Dao: public Qu selQu(String dno){ Session session=HibernateSessionFacto ...

  6. hibernate 多表查询

    Hibernate主要支持两种查询方式:HQL查询和Criteria查询.前者应用较为广发,后者也只是调用封装好的接口. 现在有一个问题,就是实现多表连接查询,且查询结果集不与任何一个实体类对应,怎么 ...

  7. Hibernate多表查询连接操作

    SQL多表操作分类; 1.交叉连接:select*from t_customer cross Join t_order; 2.显示内连接: select*from t_customer c inner ...

  8. Hibernate 多表查询 - Criteria添加子字段查询条件 - 出错问题解决

    Criteria 查询条件如果是子对象中的非主键字段会报 could not resolve property private Criteria getCriteria(Favorite favori ...

  9. 【Hibernate 多表查询】

    HibernateManyTable public class HibernateManyTable { //演示hql左连接查询 @Test public void testSelect12() { ...

随机推荐

  1. shell脚本格式的几点注意:格式严格,空格不能随便出现(一写就记不住)

    shell脚本中,不能随意添加空格,否则出错: 1,=等号两边必须无空格.否则出错.如i =$1和i= $1都是错的.但是在()内部不限制如for ((i= 1;i < 3;i= i+1))是正 ...

  2. 数据结构基础(3) --Permutation & 插入排序

    Permutation(排列组合) 排列问题: 设R = {r1, r2, ... , rn}是要进行排列的n个元素, Ri = R-{ri}; 集合X中元素的全排列记为Permutation(X), ...

  3. 框架页面高度自动刷新Javascript脚本

    实现原理:加载index.htm时候,每隔1秒钟自动调用脚本刷新框架页面代码 代码优点:只需要设置index.html框架页面中的脚本,调用加载的子页面中不需要设置任何代码. index.htm代码如 ...

  4. ITU-T Technical Paper: QoS的构建模块与机制

    本文翻译自ITU-T的Technical Paper:<How to increase QoS/QoE of IP-based platform(s) to regionally agreed ...

  5. 10个精选的颜色选择器Javascript脚本及其jQuery插件

     Color picker即颜色选择器使我们在web开发中可能经常用到的组件,今天我们特意精选了10个超酷的颜色选择器实现,其中包括了javascript脚本 实现及其传说中的jQuery插件实现 ...

  6. Leetcode_231_Power of Two

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/47334243 Given an integer, writ ...

  7. 详解Linux2.6内核中基于platform机制的驱动模型 (经典)

    [摘要]本文以Linux 2.6.25 内核为例,分析了基于platform总线的驱动模型.首先介绍了Platform总线的基本概念,接着介绍了platform device和platform dri ...

  8. android https安全连接

    如果不需要验证服务器端证书,直接照这里做 [java] view plaincopy public class Demo extends Activity { /** Called when the  ...

  9. HBase 协处理器实现二级索引

    HBase在0.92之后引入了coprocessors,提供了一系列的钩子,让我们能够轻易实现访问控制和二级索引的特性.下面简单介绍下两种coprocessors,第一种是Observers,它实际类 ...

  10. 新闻网站开发-手机端-基于Wordpress

    暂时写下来下面记录整个网站制作流程,由于是边学便用,代码质量和性能不能保证,仅仅为之前没做过的朋友提供个小小的参考: 下面先贴出网站,记得用手机或者[Opera Mobile Emulator]打开, ...