Pregunta

Tengo el siguiente Java 6 código:

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

Recibo un error de sintaxis en el último cierre de paréntesis derecho.Eclipse da:"Insertar EnumBody para completar la instrucción de bloque" y "Insertar enum Identificador para completar EnumHeaderName".Similares error de sintaxis de javac.

¿Qué estoy haciendo mal?

¿Fue útil?

Solución

La Hibernate annotations docs (http://www.hibernate.org/hib_docs/annotations/reference/en/html_single/) sugieren que esta debe ser una clase de nivel de anotación en vez de ocurrir en línea dentro de su código.Y, de hecho, cuando yo pegar ese código en mi IDE y moverla, los errores de compilación se presentan cuando la anotación está en línea, pero se desvanecen cuando me lo puse arriba de la declaración de la clase:

@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 no tengo pruebas de que el código anterior funcione.Sólo he comprobado que no causa errores de compilación.

Otros consejos

Su ejemplo proviene directamente de la API de google docs que, por desgracia, mal presentada.

Su anotación debe ser colocado en una clase, probablemente, uno en el que usted será la creación de la consulta para utilizar el resultado de la asignación de un conjunto.Sin embargo, en realidad no importa donde esta anotación se coloca.Su JPA proveedor realmente mantener una lista global de todas estas asignaciones, así que no importa donde usted defina, usted será capaz de utilizarlo en cualquier lugar.

Este es un defecto del método de anotación (en oposición a la especificación de las cosas en XML). Muchas otras cosas en la JPA (es decir,consultas con nombre) se definen de la misma manera.Esto hace que parezca como que hay algún tipo de conexión entre la cosa está definido y la clase en la que está anotado, cuando no lo es.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top