Синтаксис Java EE SqlResultSetMapping - PullRequest
3 голосов
/ 16 сентября 2008

У меня есть следующий код 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.

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 16 сентября 2008

Документы аннотаций 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 голосов
/ 16 сентября 2008

Ваш пример взят прямо из документации по API, которая, к сожалению, плохо представлена.

Ваша аннотация должна быть размещена в каком-то классе, вероятно, в том, в котором вы будете создавать запрос для использования отображения набора результатов. Однако на самом деле не имеет значения, где размещена эта аннотация. Ваш провайдер JPA фактически будет вести глобальный список всех этих сопоставлений, поэтому независимо от того, где вы его определите, вы сможете использовать его где угодно.

Это недостаток метода аннотации (в отличие от указания вещей в XML.) Многие другие вещи в JPA (то есть именованные запросы) определяются таким же образом. Создается впечатление, что существует какая-то связь между определяемой вещью и классом, для которого она аннотирована, когда это не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...