2008-09-15 8 views
3

私は次のJava 6のコードがあります。のJava EE SqlResultSetMapping構文

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

を私は最後の右括弧に構文エラーを受け取ります。 Eclipseには、「ブロック文を完成させるためにEnumBodyを挿入する」と「EnumHeaderNameを完成させるために列挙識別子を挿入する」があります。 javacと同様の構文エラーです。

私は間違っていますか?

答えて

1

Hibernateの注釈のドキュメント(http://www.hibernate.org/hib_docs/annotations/reference/en/html_single/)が、これはむしろ、あなたのコード内でインラインで起こるよりも、クラスレベルの注釈であることを示唆しています。そして実際、私は私のIDEにそのコードを貼り付け、それを周りに移動すると、注釈がインラインであるとき、コンパイルエラーが存在しているが、私はクラス宣言の上にそれを置いたときに消える:

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

...明らかに私は、上記のコードが実際に動作するという証拠はありません。コンパイルエラーが発生していないことを確認しただけです。

+0

あなたはネイティブクエリを構築している場合、あなたは(... IDを選択し、firstNameの、姓)あなたはにマッピングするか、個々の列を選択することができますクラスを表すテーブルからSELECT *なければならないのです? 私は今晩早く後者を試して、私が質問に含めなかったテーブルのフィールドに関連するエラーを受けました。 – kshep92

0

あなたの例は、残念ながら不十分に提示されているAPIドキュメントからまっすぐに抜け出しています。

アノテーションは、結果セットマッピングを使用するためのクエリを作成するクラスに配置する必要があります。ただし、この注釈がどこに配置されているかは実際問題ではありません。 JPAプロバイダはこれらすべてのマッピングのグローバルリストを実際に維持するので、どこに定義してもどこでも使用できます。

これは、(XMLで物事を指定とは対照的に)注釈法の欠点であるJPA(すなわち、名前付きクエリ)の多くの他のものは、これと同じ方法で定義されています。それは定義されているものと注釈されているクラスとの間に何らかの関連があるように見えます。余談で