Pergunta

Eu tenho o seguinte código Java 6:

    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 )
        }
    )

Recebo um erro de sintaxe no último parêntese direito de fechamento.Eclipse dá:"Insira EnumBody para completar a instrução do bloco" e "Insira o identificador enum para completar EnumHeaderName".Erro de sintaxe semelhante do javac.

O que estou fazendo de errado?

Foi útil?

Solução

Os documentos de anotações do Hibernate (http://www.hibernate.org/hib_docs/annotations/reference/en/html_single/) sugerem que esta deve ser uma anotação em nível de classe, em vez de ocorrer in-line em seu código.E, de fato, quando colo esse código em meu IDE e o movo, os erros de compilação estão presentes quando a anotação está embutida, mas desaparecem quando a coloco acima da declaração da classe:

@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 );
   }
}

...obviamente não tenho evidências de que o código acima realmente funcione.Apenas verifiquei que isso não causa erros de compilação.

Outras dicas

Seu exemplo vem direto dos documentos da API que, infelizmente, são mal apresentados.

Sua anotação deve ser colocada em alguma classe, provavelmente aquela na qual você criará a consulta para usar o mapeamento do conjunto de resultados.No entanto, na verdade não importa onde esta anotação é colocada.Na verdade, seu provedor JPA manterá uma lista global de todos esses mapeamentos, portanto, não importa onde você o defina, você poderá usá-lo em qualquer lugar.

Esta é uma deficiência do método de anotação (em oposição à especificação de coisas em XML). Muitas outras coisas no JPA (ou seja,consultas nomeadas) são definidas da mesma maneira.Faz parecer que há algum tipo de conexão entre o que está sendo definido e a classe na qual está anotado, quando não é.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top