Синтаксис Java EE SqlResultSetMapping

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

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
0
9 516
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

С другой стороны, если вы создаете собственный запрос, нужно ли вам выбирать * из таблицы, которая представляет класс, которому вы сопоставляете, или вы можете выбрать отдельные столбцы (выберите id, firstName, lastname ...)? Я попробовал последнее сегодня вечером и получил ошибки, относящиеся к полям из таблицы, которые я не включил в запрос.

kshep92 14.08.2013 05:20

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

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

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

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