2008-09-15 11 views
3

Ich habe folgende Java 6 Code:Java EE SqlResultSetMapping Syntax

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 dem letzten Schließen rechten Klammer. Eclipse gibt Folgendes an: "EnumBody einfügen, um die Block-Anweisung abzuschließen" und "Enum-Kennung einfügen, um EnumHeaderName zu vervollständigen". Ähnlicher Syntaxfehler von javac.

Was mache ich falsch?

Antwort

1

Die Hibernate-Annotationsdokumente (http://www.hibernate.org/hib_docs/annotations/reference/en/html_single/) schlagen vor, dass es sich um eine Annotation auf Klassenebene handelt, die nicht inline innerhalb Ihres Codes auftritt. 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); 
    } 
} 

... offensichtlich I habe keinen Beweis, dass der obige Code tatsächlich funktioniert. Ich habe nur überprüft, dass es keine Kompilierungsfehler verursacht.

+0

Wenn Sie eine native Abfrage erstellen, müssen Sie AUSWÄHLEN * aus der Tabelle auswählen, die die Klasse darstellt, der Sie zuordnen, oder einzelne Spalten auswählen (ID, Vorname, Nachname usw.). ? Ich versuchte letzteres heute Abend und erhielt Fehler in Bezug auf die Felder aus der Tabelle, die ich nicht in die Abfrage aufgenommen habe. – kshep92

0

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

Ihre Annotation sollte in einer Klasse platziert werden, wahrscheinlich in der Klasse, in der Sie die Abfrage erstellen, um die Ergebnismengenzuordnung zu verwenden. Es spielt jedoch keine Rolle, wo diese Annotation platziert wird. Ihr JPA-Provider wird tatsächlich eine globale Liste aller dieser Mappings verwalten, so dass Sie ihn unabhängig davon, wo Sie sie definieren, überall verwenden können.

Dies ist ein Nachteil der Annotationsmethode (im Gegensatz zur Angabe von Dingen in XML.) Viele andere Dinge in der JPA (d. H. Benannte Abfragen) sind auf dieselbe Weise definiert. Es scheint so, als bestünde eine Art Verbindung zwischen dem Ding, das definiert wird, und der Klasse, an der es notiert ist, wenn es nicht ist.