在我们的遗留代码中,我偶然发现了一个我无法完全理解的hibernate类实现。
有一个与表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会话中所有CCSRequestGroups的条件='AwaitingStartTime'。
在这里吃大脑的是'条件'是CCSReleaseCandidates的成员而不是CCSRequestGroup,那么我们如何能够成功获得CCSRequestGroup实例的条件成员。
有人可以帮帮我吗?
答案 0 :(得分:0)
我想如果你打开SQL日志,你会发现你认为简单的语句实际上是在幕后与子类表进行外连接。这就是Hibernate可以获得数据的原因,而HQL本身可能正在利用隐式多态来向您返回正确的结果。