3

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

最後の閉じ右括弧で構文エラーが発生します。Eclipseは、「EnumBodyを挿入してブロックステートメントを完成させます」および「列挙型識別子を挿入してEnumHeaderNameを完成させます」。javac からの同様の構文エラー。

私は何を間違っていますか?

4

2 に答える 2

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

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

于 2008-09-15T20:37:09.337 に答える
0

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

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

これは、アノテーション メソッドの欠点です (XML で指定するのとは対照的です)。JPA の他の多くのもの (つまり、名前付きクエリ) は、これと同じ方法で定義されます。定義されているものとそれが注釈されているクラスとの間に何らかの関係があるように見えますが、そうではありません。

于 2008-09-15T20:51:21.270 に答える