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

时间: 2024-12-20 16:21:22

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

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

Hibernate应用SQL查询返回实体类型 Hibernate使用SQL查询返回实体类型 以前,使用SQL查询,结果放在 RS 结果集中,还要去转换影射到Java类中.Hibernate中,可以自动帮我们注入到Hibernate 甚至是 非 Hibernate 类型当中. String sql = "select * from T_TMP_PUBLIC_POLICY TP"; SQLQuery sqluery = session.createSQLQuery(sql).addEnti

Hibernate用Sql查询封装到实体类

Hql查询语句可以自动封装到实体类中,但是sql语句需要用到方法才可以 1 @Override 2 @SuppressWarnings("unchecked") 3 public <T> Pagination<T> getPageResultObjectParamsBySql(Class<T> clazz, 4 String hql, int pageNo, int pageSize, 5 Object[] param) 6 throws Runti

hibernate 多表查询

Hibernate主要支持两种查询方式:HQL查询和Criteria查询.前者应用较为广发,后者也只是调用封装好的接口. 现在有一个问题,就是实现多表连接查询,且查询结果集不与任何一个实体类对应,怎么解决呢? 举个例子: 现在有两个表,一个users用户表, 一个goods商品表,每个用户可以有多个商品,而一个商品只能对应一个用户. users表中的字段:userId,userName,telephone,address goods表中的字段:goodsId,goodsName,userId 现

hibernate多表查询HQL

inner join(内连接) left outer join(左外连接) right outer join(右外连接) full join (全连接,并不常用) SQL中的条件用on即:left join ... on... HQL中的条件用with即:left join ... with... 语句inner join, left outer join 以及 right outer join 可以简写. from Cat as cat     join cat.mate as mate   

【Hibernate步步为营】--hql查询之实体对象查询

上篇文章简单介绍了hql它作为Hibernate的查询语言,封装了基本上SQL的所有查询操作,HQL能够实现对数据库文件的增删改查,该篇文章着重讨论HQL实体对象的查询方法. 一.实体对象查询 实体对象查询是hql查询的基础,作为一种对象查询语言,在查询操作时和sql不同,查询字符串中的内容要使用类名和类的属性名来代替.这种查询方法相对简单,只要有SQL功底,使用hql是很简单的,但是有一些问题需要注意,就是查询获取数据不是目的,需要考虑的是如何编写出高效的查询语句,这才是讨论的重点. 1.1

Spring Hibernate JPA 联表查询 复杂查询

(转自:http://www.cnblogs.com/jiangxiaoyaoblog/p/5635152.html) 今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的? 是.如果hibernate认为jpa的注解够用,就直接用.否则会弄一个自己的出来作为补充. 2)jpa和hibernate都提供了Entity,我们应该用哪个,还是说可以两个一起用? Hibernate的Entity是继承了jpa的,所以如果觉得jpa的不够用,直接使用hibernate的即可

hibernate学习---单表查询

我们都知道SQL是非常强大的,为什么这么说呢?相信学过数据库原理的同学们都深有体会,SQL语句变化无穷,好毫不夸张的说可以实现任意符合我们需要的数据库操作,既然前面讲到Hibernate非常强大,所以Hibernate也是能够实现SQL的一切数据库操作. 在SQL中,单表查询是最常用的语句,同理Hibernate最常用到的也是查询语句,所以今天就来讲讲Hibernate的单表查询: 今天要将的内容分以下几点: 查询所有 查询结果排序 为查询参数动态赋值 分页查询 模糊查询 唯一性查询 聚合函数查

Linq多表查询 返回组合实体 踩坑记

新年就不再记流水账了吧,无关紧要的日志太多也不好,有时要找自已记录的一些要点要翻半天 春节假期在家陆陆续续也有在做公司的事,主要是重构,接手的代码看着比较乱,花了很多时间来重构,现在看上去好多了. 使用Linq进行多表查询,要返回各个表的几个组合数据, public class A{ public string NameA{get; set;} } public class B{ public string NameB{get; set;} } 1.原先项目是定义了一个类,里面包含几张表的各个字

【Hibernate】Hibernate的多表查询

在<[Hibernate]Hibernate的聚类查询.分组查询.排序与时间之差>(点击打开链接)一文中已经讲述过怎样利用HQL语句代替SQL语句.进行聚类查询.分组查询.排序与时间之差的查询,同一时候指出hql能代替sql语句做不论什么事情.我原本以为hql语句的多表查询,要先对里面的实体做Java与xml的改动,事实上并不须要,相同是一句HQL语句就能搞定的事情.SQL的多表查询已经在<[Mysql]利用内连接与嵌套查询实现多表查询.主键.外键的基本概念>(点击打开链接)讲过.