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中 传到前台。
}
相关文章推荐
- Cocos2dx - Scheduler学习理解
- 【杭电-oj】-2073-无限的路(看起来很吓人的数学,开始都不敢做的)
- android studio将代码关联到git@osc(出现 Empty repository,以及push reject解决)
- [编译原理]学习笔记(一)——编译概述
- 平衡搜索树-AVL树
- openstack晋级攻略
- openstack晋级攻略
- Android常见问题总结(三)
- leetcode-62. Unique Paths
- 使用PS为Unity游戏创建简单的游戏素材实例
- 剑指offer 面试题(1)
- 彻底解决显示Opencv中Mat图像到Mfc窗口问题
- 学习进度表 08
- 欢迎使用CSDN-markdown编辑器
- Redis命令-集合-sinterstore
- 奶牛家族
- jQuery UI型插件
- 学习进度表 07
- jquery.jeditable的改造
- Fresco的使用(一):在XML中使用Drawees