2013-05-03 3 views
0

확장 할 수있는 일반 클래스와 확장 할 수있는 일반 자식 멤버가 있습니다. 나는 Hibernate HQL에서 SpecialGroup의 특별한 속성을 기반으로 SpecialGroupMembers를 선택하기를 원하기 때문에 SpecialGroupMember의 그룹 참조를 "Group"대신에 SpecialGroup으로 만들고자한다. 아래의 설정에서, Hibernate는 다음 질의에 대해 에러를 던질 것이다.Java Generics 하위 하위 참조 하위/하위 클래스 속성 선택

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

그룹을 통해 선택할 수 있으려면 특수 속성이 그룹 토큰 (어쩌면 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; 
} 

는 최대 절전 모드 나 다른 ORM 프레임 워크의 주요 사용 사례 중 하나는 제 생각에이 매우 좋지 않아, 데이터베이스 객체에 상속 등을 제공하는 것입니다 동안. 문서에서 설명한 것 이상으로이 기능을 사용하려고하면 대부분 악몽을 꾼다.

관련 문제