以前用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;
如果我们按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中,可以使用以下几种方式来实现多表联合查询: - **HQL (Hibernate Query Language)** - **Criteria API** - **Native SQL** 本文将重点介绍如何使用HQL和Native SQL来实现多表联合查询。 #### 三、...
#### 三、多表联合查询的Hibernate实现 根据给定的代码片段,可以看出这是一个关于多表联合查询的应用示例。具体来看: ##### 1. 方法定义 方法名为`rsCountListNoPage`,其参数包括: - `beginYear`:开始年份。...
本文将深入探讨如何通过配置优化Hibernate的多表查询,以提高应用的性能。 1. **联合查询优化**: 在进行多表查询时,Hibernate默认可能会生成多个单表查询,这会导致大量的数据库往返,降低效率。通过配置`@Join...
本文将深入探讨Hibernate中的多表查询技术,解析其背后的原理与实践方法,帮助开发者更好地掌握这一核心技能。 ### Hibernate多表查询概述 在现实世界的应用场景中,数据往往不会孤立存在,而是通过关联分布在多个...
通过以上步骤,你就可以在MyEclipse中成功地使用Hibernate实现联合主键了。联合主键提供了一种灵活的方式来处理那些单一主键无法满足需求的复杂业务场景。在实际项目中,正确理解和使用联合主键对于优化数据模型和...
4. **多表查询与操作**:在多表关联的场景下,常见的操作有联合查询、级联保存/更新和级联删除。例如,通过Hibernate的 Criteria 或 HQL 查询语言,可以方便地执行多表的JOIN操作。级联保存时,只需要保存父对象,...
在探讨Hibernate中联合主键的使用时,我们首先需要理解什么是联合主键以及它在Hibernate框架中的实现方式。联合主键(Composite Primary Key),是指在数据库表中使用两个或多个字段共同作为主键来唯一标识每一行...
在多表联合操作中,Hibernate通过HQL(Hibernate Query Language)或JPQL(Java Persistence Query Language)支持复杂的SQL查询,包括JOIN操作。我们可以定义一对多、多对一或多对多的关系映射,简化多表操作。 ...
3. **中间表配置**:虽然大多数情况下Hibernate会自动创建中间表,但你也可以通过`@JoinTable`注解自定义中间表的细节,如表名、联合主键等。例如: ```java @ManyToMany @JoinTable(name = "student_course", ...
在Java的持久化框架Hibernate中,联合主键(Composite Key)是一种特殊的数据模型设计,用于处理具有多个字段作为主键的实体。联合主键通常在数据表中的某些列共同决定了唯一标识的情况出现。在Hibernate中,有三种...
通过查看代码和运行示例,开发者可以深入理解Hibernate是如何自动处理复杂的关联操作,比如通过中间表实现多对多的添加、删除和查找。 **总结** 这个"Hibernate多对多实例+数据库代码"涵盖了ORM的核心概念,特别是...
在 Hibernate 中,联合主键(Composite Key)是指由两个或多个属性共同构成的主键,这种主键在数据库设计中常见于需要多个字段唯一标识一条记录的情况。在 Hibernate 中设置联合主键通常需要以下几个步骤: 1. **...
在Hibernate中,可以通过外键关联或联合主键来实现。 1. **外键关联** - 单向:一个实体类包含另一个实体类的引用,通过`@OneToOne`注解和`@JoinColumn`指定外键字段。 - 双向:两个实体类互相引用,使用`mapped...
6. **实体继承**: Hibernate支持单表继承、联合继承和多表继承,可以根据需求选择合适的继承策略。 在"基于hibernate的简单留言本"项目中,理解并熟练掌握以上知识点是至关重要的。这个项目为初学者提供了实战经验...
ORM思想,hibernate介绍,hibernate.cfg.xml配置,hbm.xml映射文件详解,主键生成策略使用,PO对象状态及状态的转换分析、一级缓存,Hibernate数据检索技术,Hibernate高级映射技术,Hibernate多表联合查询, ...
在双表查询中,Hibernate可以通过一对多、多对一或多对多的关系映射,实现两个表之间的关联查询,无需编写繁琐的SQL语句。 JDBC(Java Database Connectivity)是Java标准API,用于连接和操作数据库。虽然Hibernate...
这可能涉及到多表联合查询,或者在生成SQL时加入动态表名。Hibernate的事件监听器或拦截器可以用来在执行SQL之前对其进行修改。 4. **事务管理**:在分表环境下,跨表的操作可能涉及到分布式事务。Spring的事务管理...
在这个实例中,我们将深入探讨如何利用这两个框架实现CRUD(创建、读取、更新、删除)操作,并结合多对一查询以及部分表删除功能。 首先,CRUD操作是任何数据库应用的基础。在Struts框架中,我们通常会定义Action类...
这个“SSH的多表联合源代码”很可能是为了展示如何在SSH框架下实现数据库中的多表关联查询和操作。下面将详细解释SSH框架的各个组成部分以及它们在多表联合操作中的应用。 1. **Struts2**:这是一个基于MVC设计模式...
5. **关联查询**:HQL可以轻松处理关联查询,通过`JOIN`关键字联合多个表。例如,获取每个用户的所有订单: ```java hql = "from User u join fetch u.orders"; users = session.createQuery(hql).list(); ``` 在...