Domanda

Ho il seguente codice 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 )
        }
    )

Ricevo un errore di sintassi sull'ultima parentesi chiusa a destra.Eclipse dà:"Inserisci EnumBody per completare l'istruzione di blocco" e "Inserisci l'identificatore enum per completare EnumHeaderName".Errore di sintassi simile da javac.

Che cosa sto facendo di sbagliato?

È stato utile?

Soluzione

I documenti sulle annotazioni di Hibernate (http://www.hibernate.org/hib_docs/annotations/reference/en/html_single/) suggeriscono che questa dovrebbe essere un'annotazione a livello di classe anziché essere inserita in linea nel codice.E in effetti quando incollo quel codice nel mio IDE e lo sposto, gli errori di compilazione sono presenti quando l'annotazione è in linea, ma svaniscono quando lo inserisco sopra la dichiarazione della 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 );
   }
}

...ovviamente non ho prove che il codice sopra funzioni effettivamente.Ho solo verificato che non causa errori di compilazione.

Altri suggerimenti

Il tuo esempio proviene direttamente dai documenti API che purtroppo sono presentati male.

La tua annotazione dovrebbe essere inserita in qualche classe, probabilmente quella in cui creerai la query per utilizzare la mappatura del set di risultati.Tuttavia, in realtà non ha importanza dove viene posizionata questa annotazione.Il tuo provider JPA manterrà effettivamente un elenco globale di tutte queste mappature, quindi non importa dove lo definisci, sarai in grado di utilizzarlo ovunque.

Questo è un difetto del metodo di annotazione (al contrario di specificare cose in XML). Molte altre cose nell'APP (ad es.query denominate) sono definite allo stesso modo.Sembra che ci sia una sorta di connessione tra la cosa definita e la classe su cui è annotata, quando non lo è.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top