我有一个可以扩展的通用类和可以扩展的通用子成员。 我试图使 SpecialGroupMember 中的组引用成为 SpecialGroup 而不是“Group”,主要是因为在 Hibernate HQL 中我想根据 SpecialGroup 的特殊属性选择 SpecialGroupMembers。在下面的配置中,Hibernate 将在以下查询上抛出错误
from SpecialGroupMember sgm inner join sgm.group grp where grp.special = true;
public class Group<T extends GroupMember>{
private List<T> members;
}
public class SpecialGroup extends Group<SpecialMember>{
private boolean special;
}
public class GroupMember{
private Group<? extends GroupMember> group;
}
public class SpecialGroupMember extends GroupMember{
private boolean something;
}
有什么建议如何以有意义的方式进行设置吗?
最佳答案
特殊属性需要存在于组中(可能设置为 false)才能通过组进行选择。由于 GroupMember 中的属性是 Group 而不是 SpecialGroup,因此只能访问 Group 类的属性。
public class Group<T extends GroupMember>{
protected boolean special = false;
private List<T> members;
}
public class SpecialGroup extends Group<SpecialMember>{
public SpecialGroup() {
special = true;
}
public class GroupMember{
private Group<? extends GroupMember> group;
}
public class SpecialGroupMember extends GroupMember{
private boolean something;
}
虽然 Hibernate 或任何其他 ORM 框架的主要用例之一是提供诸如数据库对象继承之类的功能,但在我看来,它在这方面并不是很擅长。在大多数情况下,尝试使用此功能超出文档中描述的范围将导致一场噩梦。
关于Java泛型子反向引用父级/选择子类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16366908/