当前位置: 首页 > 知识库问答 >
问题:

Hibernate继承查询

程英资
2023-03-14

我有4个实体:

用户,教师,学生,课程

和4个表:

现在我想在一个查询中选择所有有课程的用户(如果存在的话)select u from User u left join fetch u courses c(注意用户没有课程)这个select生成如下所示:

select
    ...
from
    T_USER user0_ 
left outer join
    T_TEACHER_COURSE course1_ 
        on user0_.USERID_=courses1_.TEACHER_ 
left outer join
    T_COURSE course2_ 
        on courses1_.LANE_=course2_.COURSENAME_ 
where
    user0_.GROUP_=?

您可以清楚地看到,Hibernate没有与t_student_course表连接

我正在使用Hibernate 4.1 Final

问题:Hibernate支持这样的查询吗

a)如果支持,那么为什么它不为student实体获取课程?

b)如果不支持,我如何选择所有的用户与他们的课程使用JPQL?

共有1个答案

芮化
2023-03-14

由于u.cources可以是student.courcesteacher.cources,Hibernate通过在其元数据中选择与此名称的第一个(或最后一个)关联来解决歧义。

如果courses集合的名称在两个子类中不相同,则可能会起作用。例如,可以定义student.attendedcoursesteacher.teachedcourses

否则,您将不得不发出两个查询(一个针对教师,一个针对学生),并加入结果列表。或者必须在用户实体中拉出关联。

 类似资料:
  • 假设类“X”映射到表“X”,类“A”映射到表“A”,类“B”映射到表“B”。 表X结构:(X_ID,一些其他列表A结构:(A_Id,X_Id,一些其他列)表B结构:(A_Id,一些其他列)...表B也有A_Id “B”类扩展了“A”类。我们将它们的映射文件都设置为: “A”类父映射文件: “B”类映射文件: 现在,我有一个SQL查询,如下所示,我需要使用hibernate criteria API

  • 我有两个实体BillingAddress和ShippingAddress映射到具有鉴别器类型列的表地址。 我能够使用不同的类型值在DB中成功保存/更新两个地址类型。 我面临的问题是当我查询地址表时,如下所示: 这工作正常,但查询ShippingAddress会引发非均匀查询结果异常,即结果中同时包含ShippingAddress和Billingaddress。请让我知道,我应该怎么做。

  • 1. 前言 本节课程和大家一起学习继承映射。通过本节课程的学习,你将了解到: 什么是继承映射; 实现继承映射的 3 种方案。 2. 继承映射 学习继承映射之前,需要搞清楚什么是继承映射? 继承是 OOP 中的概念,其目的除了复用代码之外,还用来描述对象在现实世界中的关系。 为了更好地讲解继承映射,咱们再在数据库中创建一张老师表。数据库中多了一张表,按照使用 Hibernate 的套路,理所当然应该

  • 并尝试通过Hibernate使用策略连接实现继承,但当我使用此策略时,我收到异常: 奇怪的是,如果我选择另一个策略(单表或TABLE_PER_CLASS),错误不会出现

  • 我在Hibernate中有道传承,下面是代码: 用户DAO: 我有一个域类用户和两个子类用户:Customer和Sales。我有两个dao类,分别用于客户和销售。 用户DAO: 客户道: 销售DAO: 我的问题是,当我使用CusterDap调用方法getUserByUsername()(继承自BaseDaoImpl)与销售的用户名(拥有用户名的用户是SalesRep的实例,而不是客户)时,它会抛出

  • 假设类“X”映射到表“X”,类“A”映射到表“A”,类“B”映射到表“B”。 表X结构:(X\u ID,其他一些列表A结构:(A\u ID,X\u ID,其他一些列)表B结构:(A\u ID,其他一些列)。。。表B也有一个\u Id “B”类扩展了“A”类。我们将它们的映射文件都设置为: “A”类父映射文件: “B”类映射文件: 现在,我有一个SQL查询,如下所示,我需要使用Hibernate标准