一个老师教许多学生,一个学生被许多老师教,一个学生有好多书,同一种书被许多同学拥有.
要查询教拥有书"a"的学生的老师!
HQL如何写呀?如何取值?
classTeacher{
Stringid;
Stringname;
Setstudents;
}
classStudent{
Stringid;
Stringname;
Setteachers;
Setbooks;
}
classBook{
Stringid;
Stringname;
Setstudents;
}
<classname="net.fengrun.lzk.stu.Book"table="books">
<idname="id"type="integer"column="id">
<generatorclass="native"/>
</id>
<propertyname="name"/>
<setname="students"table="student_book"inverse="true"cascade="none"lazy="true">
<keycolumn="bookid"/>
<many-to-manycolumn="studentid"class="net.fengrun.lzk.stu.Student"/>
</set>
</class>
<classname="net.fengrun.lzk.stu.Student"table="students">
<idname="id"type="integer"column="id">
<generatorclass="native"/>
</id>
<propertyname="name"/>
<setname="books"table="student_book"inverse="false"cascade="none"lazy="true">
<keycolumn="studentid"/>
<many-to-manycolumn="bookid"class="net.fengrun.lzk.stu.Book"/>
</set>
<setname="teachers"table="teacher_student"inverse="false"cascade="none"lazy="true">
<keycolumn="studentid"/>
<many-to-manycolumn="teacherid"class="net.fengrun.lzk.stu.Teacher"/>
</set>
</class>
<classname="net.fengrun.lzk.stu.Teacher"table="teachers">
<idname="id"type="integer"column="id">
<generatorclass="native"/>
</id>
<propertyname="name"/>
<setname="students"table="teacher_student"inverse="true"cascade="delete-orphan"lazy="true">
<keycolumn="teacherid"/>
<many-to-manycolumn="studentid"class="net.fengrun.lzk.stu.Student"/>
</set>
</class>
Hql语句:
SELECT t FROM Teacher t join t.students s join s.books b where b.name = 'a'
解释:t.students s中s并不是集合的意思,而是t的students对象的表别名,join t.students s这个hql,hibernate会翻译成两个表的内连接关系
错误写法:
SELECT t FROM teacher t where t.students.books.name = 'a'
其实道理是很显然的,t.students是一个Set,那么这个Set怎么可能有books这样的属性呢?同理books.name也不对,所以使用表间连接并给出别名t.students s,此时的对象s才有books属性,所以可以写s.books b,最后使用b.name限制查询b.name = 'a'.
另外一种写法:
SELECT t FROM Teacher t,Student s,Book b where s.id in elements(t.students) and b.id in elements(s.books)
这种方法没有出错!不过这种方式要用子查询!但是MySql并不支持子查询,为了通用性,选择第一种做法。
未完,待续...
转自:http://ysongren.blog.163.com/blog/static/615422072008111082032493/
分享到:
相关推荐
本示例主要关注的是Hibernate中的多对多关联映射及其添加与查询方法。 多对多关联是数据库设计中的一种常见关系类型,指的是两个实体之间可以存在多个对应关系。例如,在学生与课程的关系中,一个学生可以选修多门...
在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...
### Hibernate多表联合查询详解 #### 一、引言 在实际项目开发中,我们经常需要处理复杂的数据库查询,特别是涉及到多个表之间的关联查询。...希望本文能对你理解Hibernate的多表联合查询有所帮助。
hibernate 多表查询 hibernate 多表不同于一般的sql嵌套查询,嵌套查询是不支持的,所以必须要配置好才能实现多表!只要配置好了,还是特别好用的
如果查询结果包含多个字段,并且希望将这些字段封装成一个对象,则可以使用Hibernate的投影列表功能,或者手动创建一个新的类来存储查询结果。 ### 总结 本文主要介绍了Hibernate中的连表查询方法及其在实际开发中...
总结,"Hibernate 多表连接分页查询示范项目"是一个实用的示例,它展示了如何在实际应用中利用 Hibernate Criteria API 实现复杂查询和分页,对于学习和掌握 Hibernate 的高级特性和数据库操作技巧非常有帮助。...
总之,理解和掌握Hibernate的HQL查询多对多关系是JSP开发中的重要技能,它可以帮助你高效地处理复杂的数据查询,提高代码的可读性和可维护性。如果有任何疑问,欢迎进一步探讨或查阅相关文档以深化理解。
5. **操作关联**:在代码中,可以通过Hibernate的Session接口进行添加、删除、查询等操作,以维护多对多关系。 **数据库代码** 数据库代码部分可能包括创建相关表和中间表的SQL语句,以及填充数据的INSERT语句。...
本项目“hibernate一对多项目”旨在演示如何在JavaWeb应用中使用Hibernate处理一对多的关系映射。这里我们将深入探讨 Hibernate 的一对多关系、配置以及在实际项目中的应用。 首先,一对多关系在数据库中很常见,...
本教程将带你入门Hibernate的多对多实体映射,帮助你理解如何通过源码来实现这种复杂的关系映射。 一、Hibernate概述 Hibernate是一个对象关系映射(ORM)框架,它允许我们将Java对象(实体)与数据库表进行映射,...
同时,为了初始化数据,我们可能还需要一个HQL(Hibernate查询语言)脚本或者SQL脚本来创建表和插入初始数据。 总的来说,这个“hibernate 多对多 映射实例,学生 选课”项目涵盖了Hibernate的多对多关系映射、...
“Hibernate 一对多,多对一,一对多双向关联”是指在Java持久化框架Hibernate中,实体间常见的三种关联关系。在数据库设计中,这种关联关系是常见的,例如一个用户可以有多个订单(一对多),一个订单对应一个用户...
【hibernate查询详解】 Hibernate,作为一款强大的Java对象关系映射(ORM)框架,极大地简化了数据库操作。它允许开发者使用面向对象的方式来处理数据库,从而避免了传统的JDBC编码方式带来的复杂性。本篇文章将...
在Java的持久化框架中,Hibernate是一个...对于处理一对多、多对一等关联关系,Hibernate也提供了便捷的API,使得关联对象的存取变得简单易行。在实际项目中,熟练掌握这些高级查询技巧,将极大地提升开发质量和效率。
本文将深入探讨如何通过配置优化Hibernate的多表查询,以提高应用的性能。 1. **联合查询优化**: 在进行多表查询时,Hibernate默认可能会生成多个单表查询,这会导致大量的数据库往返,降低效率。通过配置`@Join...
例如,我们可以为一个实体类定义多个HQL或SQL查询,根据实际需要选择执行哪一个。 五、FREEMARKER解析 FREEMARKER是一款强大的模板引擎,常用于Web应用中的视图渲染。在Hibernate中,我们可以利用FREEMARKER生成...
Hibernate是Java领域的一个开源ORM框架,它简化了数据库操作,通过映射Java类到数据库表,可以将数据库操作转化为对Java对象的操作。Hibernate提供了一种灵活的查询语言——HQL(Hibernate Query Language),以及 ...
Hibernate分页查询小结
在Hibernate中,这种特性使得我们可以对一个通用的父类进行操作,而无需关注其具体的子类。 2. **实体类和继承层次结构**:在Hibernate中,实体类可以构成继承关系,通过`@Inheritance`注解来定义继承策略,如...
本文将深入探讨在使用Hibernate进行MySQL查询时的一些关键知识点,以帮助开发者更好地理解和应用这些技术。 首先,我们需要理解Hibernate的核心概念。Hibernate通过提供一个中间层,将Java对象与数据库表进行映射,...