2008-09-15 3 views
3

나는 다음과 같은 자바 6 코드가 있습니다자바 EE SqlResultSetMapping 구문

Query q = em.createNativeQuery( 
     "select T.* " + 
     "from Trip T join Itinerary I on (T.itinerary_id=I.id) " + 
     "where I.launchDate between :start and :end " + 
     "or ADDDATE(I.launchDate, I.equipmentPullDayOfTrip) between :start and :end", 
     "TripResults"); 

    q.setParameter("start", range.getStart(), TemporalType.DATE); 
    q.setParameter("end", range.getEnd(), TemporalType.DATE); 

    @SqlResultSetMapping(name="TripResults", 
     entities={ 
      @EntityResult(entityClass=TripEntity.class), 
      @EntityResult(entityClass=CommercialTripEntity.class) 
     } 
    ) 

내가 마지막 닫는 오른쪽 괄호에 구문 오류가 발생합니다. Eclipse는 "블록 문을 완료하기 위해 EnumBody를 삽입하십시오"및 "EnumHeaderName을 완료하기 위해 enum 식별자를 삽입하십시오"를 제공합니다. javac에서와 유사한 구문 오류가 발생했습니다.

내가 뭘 잘못하고 있니?

답변

1

하이버 네이트 어노테이션 docs (http://www.hibernate.org/hib_docs/annotations/reference/en/html_single/)는 코드 내에서 인라인이 아닌 클래스 레벨 어노테이션이어야 함을 제안합니다.

@SqlResultSetMapping(name="TripResults", 
     entities={ 
      @EntityResult(entityClass=TripEntity.class), 
      @EntityResult(entityClass=CommercialTripEntity.class) 
     } 
    ) 
public class Foo { 
    public void bogus() { 
     Query q = em.createNativeQuery( 
     "select T.* " + 
     "from Trip T join Itinerary I on (T.itinerary_id=I.id) " + 
     "where I.launchDate between :start and :end " + 
     "or ADDDATE(I.launchDate, I.equipmentPullDayOfTrip) between :start and :end", 
     "TripResults"); 

     q.setParameter("start", range.getStart(), TemporalType.DATE); 
     q.setParameter("end", range.getEnd(), TemporalType.DATE); 
    } 
} 

나는 분명히 ... : 내 IDE에 해당 코드를 붙여 주위를 이동할 때이 클래스 선언 위를 넣어 때 실제로, 주석 인라인 때 오류가 존재 컴파일하지만 사라져 위의 코드가 실제로 작동한다는 증거는 없습니다. 컴파일 오류가 발생하지 않았 음을 확인했습니다.

+0

네이티브 쿼리를 작성하는 경우 매핑 할 클래스를 나타내는 테이블에서 SELECT *를 선택해야합니까? 아니면 개별 열을 선택할 수 있습니까 (id, firstName, lastname ... 선택) ? 나는 오늘 저녁에 후자를 시험해 보았고 나는 그 질문에 포함시키지 않은 테이블의 들판에 관한 오류를 받았다. – kshep92

0

귀하의 예는 안타깝게도 잘 알려지지 않은 API 문서에서 바로 나온 것입니다.

주석은 결과 집합 매핑을 사용하기 위해 쿼리를 생성 할 클래스에 배치해야합니다. 그러나 실제로이 주석이 어디에 배치되는지는 중요하지 않습니다. JPA 제공 업체는 실제로 모든 매핑의 전체 목록을 관리하므로 어디에서 정의하든 관계없이 어디에서나 사용할 수 있습니다.

이것은 XML에서 사물을 지정하는 것과는 대조적으로 주석 방법의 단점입니다. JPA의 많은 다른 것들 (즉, 명명 된 쿼리)도 이와 같이 정의됩니다. 정의되고있는 클래스와 주석이 달린 클래스 사이에는 어떤 종류의 연관성이있는 것처럼 보입니다.