Frage

Ich habe folgende Java 6 Code:

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

Ich erhalte einen Syntaxfehler auf der letzte Schließen rechte Klammer. Eclipse gibt: "Insert EnumBody Blockanweisung abzuschließen" und "Enum Identifier Geben Sie EnumHeaderName abzuschließen". Ähnliche Syntaxfehler von javac.

Was mache ich falsch?

War es hilfreich?

Lösung

Die Hibernate Annotations docs ( http://www.hibernate.org / hib_docs / Anmerkungen / Referenz / en / html_single / ) deutet darauf hin, dass dies eher eine Klasse-Ebene Anmerkung sollte innerhalb des Codes als auftretenden Inline. Und in der Tat, wenn ich diesen Code in meine IDE einfügen und es bewegen, kompilieren die Fehler vorhanden sind, wenn die Anmerkung inline, aber verschwinden, wenn ich es über die Klassendeklaration setzen in:

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

... natürlich habe ich keine Hinweise darauf, dass der obige Code tatsächlich funktioniert. Ich habe nur festgestellt, dass es keine Fehler kompilieren verursacht.

Andere Tipps

Ihr Beispiel kommt direkt aus der API-Dokumentation, die leider schlecht präsentiert werden.

Ihre Anmerkung sollte auf einige Klasse platziert werden, wahrscheinlich derjenige, in dem Sie die Abfrage die Ergebnismenge Mapping verwenden erstellt werden soll. Aber es ist eigentlich keine Rolle, wo diese Anmerkung platziert wird. Ihre JPA-Provider halten tatsächlich eine globale Liste all diese Zuordnungen, also egal, wo Sie es definieren, können Sie es überall nutzen.

Dies ist ein Manko der Anmerkung Methode (im Gegensatz zu den Dingen in XML. Angabe) Viele andere Dinge in der JPA (das heißt benannten Abfragen) werden auf diese gleiche Weise definiert. Es macht es scheint, wie es irgendeine Art von Verbindung zwischen der Sache definiert ist und die Klasse, auf das sie mit Anmerkungen versehen werden, wenn es nicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top