在我们的遗留代码中,我偶然发现了一个无法完全理解的休眠类实现。

有一个对应于表WORK_REQUEST_GROUPS的超类-

@Entity
@Table(name="WORK_REQUEST_GROUPS")
@Inheritance(strategy=InheritanceType.JOINED)
public class CCSRequestGroup
{
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="REQUEST_GROUP_ID")
    private Long groupId;
    ....
}


然后我们有一个对应于表RELEASE_CANDIDATES的子类-

@Entity
@Table(name="RELEASE_CANDIDATES")
@PrimaryKeyJoinColumn(name="RELEASE_CANDIDATE_ID")
public class CCSReleaseCandidate extends CCSRequestGroup {

@ManyToOne
@JoinColumn(name="GROUP_CONDITION_CODE")
private CCSRequestGroupCondition condition;
....
}


根据我的理解,它指出CCSReleaseCandidates是CCSRequestGroup的子类,并在列RELEASE_CANDIDATES_ID处加入。

现在,我们有了一种方法,其中我们尝试使用某些条件找出CCSRequestGroup的实例-

List<CCSRequestGroup> requests = session.createQuery("from CCSRequestGroup requestGroup where requestGroup.condition = \'AwaitingStartTime\' order by RAND()").list();


它可能试图找出当前Hibernate会话中所有条件为“ AwaitingStartTime”的CCSRequestGroup。

这里让我吃惊的是,“条件”是CCSReleaseCandidates的成员而不是CCSRequestGroup,那么我们如何才能成功获取CCSRequestGroup实例的条件成员。

有人能帮帮我吗?

最佳答案

我想如果您打开SQL日志记录,您会发现您认为简单的语句实际上是在后台与子类表进行外部联接。这就是为什么数据可供Hibernate使用的原因,而HQL本身可能正在利用隐式多态性向您返回正确的结果。

10-06 02:35