`

Hibernate多对多查询

 
阅读更多

一个老师教许多学生,一个学生被许多老师教,一个学生有好多书,同一种书被许多同学拥有.

要查询教拥有书"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多对多关联添加及查询示例

    本示例主要关注的是Hibernate中的多对多关联映射及其添加与查询方法。 多对多关联是数据库设计中的一种常见关系类型,指的是两个实体之间可以存在多个对应关系。例如,在学生与课程的关系中,一个学生可以选修多门...

    hibernate多对多关联映射

    在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...

    hibernate多表联合查询

    ### Hibernate多表联合查询详解 #### 一、引言 在实际项目开发中,我们经常需要处理复杂的数据库查询,特别是涉及到多个表之间的关联查询。...希望本文能对你理解Hibernate的多表联合查询有所帮助。

    hibernate 多表查询

    hibernate 多表查询 hibernate 多表不同于一般的sql嵌套查询,嵌套查询是不支持的,所以必须要配置好才能实现多表!只要配置好了,还是特别好用的

    Hibernate连表查询 Hibernate连表查询

    如果查询结果包含多个字段,并且希望将这些字段封装成一个对象,则可以使用Hibernate的投影列表功能,或者手动创建一个新的类来存储查询结果。 ### 总结 本文主要介绍了Hibernate中的连表查询方法及其在实际开发中...

    Hibernate 多表连接分页查询示范项目

    总结,"Hibernate 多表连接分页查询示范项目"是一个实用的示例,它展示了如何在实际应用中利用 Hibernate Criteria API 实现复杂查询和分页,对于学习和掌握 Hibernate 的高级特性和数据库操作技巧非常有帮助。...

    JSP 开发之hibernate的hql查询多对多查询

    总之,理解和掌握Hibernate的HQL查询多对多关系是JSP开发中的重要技能,它可以帮助你高效地处理复杂的数据查询,提高代码的可读性和可维护性。如果有任何疑问,欢迎进一步探讨或查阅相关文档以深化理解。

    Hibernate多对多实例+数据库代码

    5. **操作关联**:在代码中,可以通过Hibernate的Session接口进行添加、删除、查询等操作,以维护多对多关系。 **数据库代码** 数据库代码部分可能包括创建相关表和中间表的SQL语句,以及填充数据的INSERT语句。...

    hibernate一对多项目

    本项目“hibernate一对多项目”旨在演示如何在JavaWeb应用中使用Hibernate处理一对多的关系映射。这里我们将深入探讨 Hibernate 的一对多关系、配置以及在实际项目中的应用。 首先,一对多关系在数据库中很常见,...

    hibernate 映射关系学习入门 多对多实体映射

    本教程将带你入门Hibernate的多对多实体映射,帮助你理解如何通过源码来实现这种复杂的关系映射。 一、Hibernate概述 Hibernate是一个对象关系映射(ORM)框架,它允许我们将Java对象(实体)与数据库表进行映射,...

    hibernate 多对多映射实例,学生 选课

    同时,为了初始化数据,我们可能还需要一个HQL(Hibernate查询语言)脚本或者SQL脚本来创建表和插入初始数据。 总的来说,这个“hibernate 多对多 映射实例,学生 选课”项目涵盖了Hibernate的多对多关系映射、...

    hibernate一对多,多对一,一对多双向关联

    “Hibernate 一对多,多对一,一对多双向关联”是指在Java持久化框架Hibernate中,实体间常见的三种关联关系。在数据库设计中,这种关联关系是常见的,例如一个用户可以有多个订单(一对多),一个订单对应一个用户...

    通用的hibernate查询

    【hibernate查询详解】 Hibernate,作为一款强大的Java对象关系映射(ORM)框架,极大地简化了数据库操作。它允许开发者使用面向对象的方式来处理数据库,从而避免了传统的JDBC编码方式带来的复杂性。本篇文章将...

    Hibernate的高级查询

    在Java的持久化框架中,Hibernate是一个...对于处理一对多、多对一等关联关系,Hibernate也提供了便捷的API,使得关联对象的存取变得简单易行。在实际项目中,熟练掌握这些高级查询技巧,将极大地提升开发质量和效率。

    hibernate代码优化基于配置的多表查询

    本文将深入探讨如何通过配置优化Hibernate的多表查询,以提高应用的性能。 1. **联合查询优化**: 在进行多表查询时,Hibernate默认可能会生成多个单表查询,这会导致大量的数据库往返,降低效率。通过配置`@Join...

    hibernate实现动态SQL查询

    例如,我们可以为一个实体类定义多个HQL或SQL查询,根据实际需要选择执行哪一个。 五、FREEMARKER解析 FREEMARKER是一款强大的模板引擎,常用于Web应用中的视图渲染。在Hibernate中,我们可以利用FREEMARKER生成...

    Hibernate_query查询数据表中的一个字段.

    Hibernate是Java领域的一个开源ORM框架,它简化了数据库操作,通过映射Java类到数据库表,可以将数据库操作转化为对Java对象的操作。Hibernate提供了一种灵活的查询语言——HQL(Hibernate Query Language),以及 ...

    Hibernate分页查询小结

    Hibernate分页查询小结

    hibernate的多态查询

    在Hibernate中,这种特性使得我们可以对一个通用的父类进行操作,而无需关注其具体的子类。 2. **实体类和继承层次结构**:在Hibernate中,实体类可以构成继承关系,通过`@Inheritance`注解来定义继承策略,如...

    Hibernate的MySql查询.rar

    本文将深入探讨在使用Hibernate进行MySQL查询时的一些关键知识点,以帮助开发者更好地理解和应用这些技术。 首先,我们需要理解Hibernate的核心概念。Hibernate通过提供一个中间层,将Java对象与数据库表进行映射,...

Global site tag (gtag.js) - Google Analytics