【问题标题】:Hibernate inheritance queryHibernate继承查询
【发布时间】:2012-06-19 06:38:21
【问题描述】:

我有 4 个实体:

UserTeacherStudentCourse

还有 4 张桌子:

t_user、t_teacher_course、t_student_course、t_course

TeacherStudent 扩展 User(带有描述符)并与 @ManyToMany 有关系 CourseUser 没有) Teacher的关系存储在t_teacher_course中,Student的关系存储在t_student_course中。

现在我想在一个查询中选择所有有课程的用户(如果存在) select u from User u left join fetch u.courses c注意用户没有课程) 这个选择产生了这样的东西:

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.1Final

问题: Hibernate 是否支持这样的查询

a) 如果支持,那么为什么它没有为Student 实体获取课程?

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

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

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

    如果courses 集合的名称在两个子类中不同,它可能会起作用。例如,您可以定义Student.attendedCoursesTeacher.teachedCourses

    否则,您必须发出两个查询(一个给教师,一个给学生),然后加入结果列表。或者您必须在 User 实体中提取关联。

    【讨论】:

    • Uau!重命名字段解决了问题!非常感谢!在您回答之前,我需要进行 3 次选择。我认为 Hibernate 应该警告 ambiguity
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 2011-01-28
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多