2013-05-06 5 views
1

내가 매핑 된 슈퍼 클래스에 NamedQuery를 선언하기 위해 노력하고있어 쿼리 명명 된,하지만 난이 오류를 얻을 :매핑 된 슈퍼 클래스

org.hibernate.hql.ast.QuerySyntaxException: VoipCall is not mapped [select v from VoipCall v where v.audioFile = :audioFile]

우리는 최대 절전 모드를 사용하지만, 우리는 JPA 표준 표기법을 사용하는 것을 선호합니다.

@MappedSuperclass 
@NamedQueries(value = { 
    @NamedQuery(name = "getVoipCallsForAudio", query = "select v from VoipCall v where v.audioFile = :audioFile") 
}) 
public abstract class VoipCall implements Serializable { 

내가 쿼리 내 mappedSuperClass을 사용할 수 없습니다 것 같다,하지만 JPA API의 난이 발견하면 왜 이해가 안 : 여기

코드입니다

The NamedQuery annotation can be applied to an entity or mapped superclass.

어디서 잘못 되었나요?

감사합니다.

해결 방법 : 해결 방법은 다음과 같습니다. 명명 된 쿼리를 where 절을 적절하게 변경하는 하위 클래스로 이동했습니다. 이것은 내 관점에서 보았을 때 코드의 유지 보수성이 떨어지지 만 다른 방법으로는 할 수 없습니다.

+0

나는 '추상적'때문에 그것을 생각합니다. AFAIK, 추상 클래스는 인스턴스화 될 수 없으며'NamedQuery'는'abstract' 키워드의 규칙을 위반하는'abstract' 클래스'VoipCall'의 인스턴스를 생성합니다. – SudoRahul

+0

초록을 제거했지만 여전히 동일한 예외가 발생합니다. –

+0

당신이 맞다고 생각합니다. 하지만 umapped 클래스에서 NamedQuery를 실행하는 것에 대해서는 여전히 확신이 없습니다! 하위 클래스에서 명명 된 쿼리를 실행해야 할 수도 있습니다. 그러면 MappedSuperClass의 모든 데이터도 가져옵니다. 그것은 그것에 대해가는 길을 보인다! – SudoRahul

답변

3

주석을 @MappedSuperClass에 넣는 것이 완벽합니다. 과거에 Hibernate는 HHH-4364이라는 이슈를 가지고 있었는데, 이것이 실패했다. 문제는 년 이후로 수정되었습니다.

매핑 된 수퍼 클래스를 쿼리 할 수 ​​없으므로 쿼리 자체는 작동하지 않습니다. JPA에서 2.0 사양이는 다음과 같은 말로 이야기한다 :

A mapped superclass, unlike an entity, is not queryable and must not be passed as an argument to EntityManager or Query operations.

이 제한은 가지 의미가 있습니다 - 매핑 된 슈퍼 클래스의 목적은 다른 비 관련 기관 간의 매핑을 공유하는 것입니다, 슈퍼 클래스가의 루트 안되는 매핑 된 엔티티 상속 계층 구조. 이러한 쿼리가 작동하면 JPA 공급 업체별 확장으로 인한 것입니다.

관련 문제