Вопрос

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

Я получаю синтаксическую ошибку в последней закрывающей правой скобке.Затмение дает:«Вставьте EnumBody для завершения оператора блока» и «Вставьте идентификатор перечисления для завершения EnumHeaderName».Аналогичная синтаксическая ошибка из javac.

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

Это было полезно?

Решение

Документы по аннотациям 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 );
   }
}

...очевидно, у меня нет доказательств того, что приведенный выше код действительно будет работать.Я только проверил, что это не вызывает ошибок компиляции.

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top