Question

J'ai le code Java 6 suivant:

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

Je reçois une erreur de syntaxe sur la dernière parenthèse fermante droite. Eclipse donne: "Insérez EnumBody pour compléter l'instruction de bloc". et "Insérer l'identificateur enum pour compléter EnumHeaderName". Erreur de syntaxe similaire de javac.

Qu'est-ce que je fais de travers?

Était-ce utile?

La solution

Les documents d'annotations d'Hibernate ( http://www.hibernate.org / hib_docs / annotations / reference / en / html_single / ) suggèrent qu'il s'agisse d'une annotation au niveau de la classe plutôt que d'une occurrence inline dans votre code. Et en effet, lorsque je colle ce code dans mon IDE et que je le déplace, les erreurs de compilation sont présentes lorsque l'annotation est en ligne, mais disparaissent lorsque je le place au-dessus de la déclaration de 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 );
   }
}

... évidemment, je n'ai aucune preuve que le code ci-dessus fonctionnera réellement. J'ai seulement vérifié que cela ne causait pas d'erreurs de compilation.

Autres conseils

Votre exemple provient directement de la documentation de l'API malheureusement mal présentée.

Votre annotation doit être placée sur une classe, probablement celle dans laquelle vous allez créer la requête pour utiliser le mappage du jeu de résultats. Cependant, peu importe où cette annotation est placée. Votre fournisseur JPA conservera en fait une liste globale de tous ces mappages. Ainsi, où que vous le définissiez, vous pourrez l'utiliser n'importe où.

Il s'agit d'une lacune de la méthode d'annotation (par opposition à la spécification d'éléments XML.) De nombreux autres éléments de JPA (c'est-à-dire aux requêtes nommées) sont définis de la même manière. Cela donne l’impression qu’il existe un lien entre l’objet défini et la classe sur laquelle il est annoté, quand ce n’est pas le cas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top