Java Generics子对父项的反向引用/对子类属性的选择

时间:2013-05-03 20:18:39

标签: java generics hql

我有一个可以扩展的泛型类和可以扩展的泛型子成员。 我试图让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;
}

有任何建议如何以有意义的方式进行设置?

1 个答案:

答案 0 :(得分:1)

特殊属性需要在Group中出现(可能设置为false)才能通过Group进行选择。由于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框架的一个主要用例是向数据库对象提供继承之类的东西,但在我看来,它并不是很擅长。在大多数情况下,试图将此功能用于文档中描述的内容将导致噩梦。