2016-07-26 3 views
0

Я работаю в частной сети, поэтому слишком сложно скопировать и вставить мой код. Я нашел множество ответов, близких к тем, что мне нужно, но никто не разработал. Я попытаюсь сделать быстрый пример моего кода, надеюсь, достаточно хорошо, чтобы расшифровать мою проблему.Карта Один столбец таблицы с гибернацией Аннотации

@Table(name="DRIVER") 
class Driver { 
    long id; //ID - primary key of Driver 
    String driverIdentStr; // DRIVER_IDENT_STR - like driver's license # 
}//end class Driver 

@Table(name="GROUP_PARTICIPANT") 
class GroupParticipant { 
    long id; //ID - primary key of GroupParticipant 
    long driverId; //DRIVER_ID - id of the Driver participanting and maps to Driver.id 

    //I just want this one value from Driver and not the whole Driver... 
    //I've tried: 
    //@Formula("(select driverIdentStr from Driver where Driver.id = DRIVER_ID)") 
    //also tried: 
    //@Column(table="DRIVER", name="driverIdentStr") 
    String driverIdentStr; 
}//end class GroupParticipant 

@Formula неудачи с «таблицей или представлений не найдено», но я определенно есть класс Driver определенного отображение в ВОДИТЕЛЬ таблицу. Когда я изменил язык запросов в @Formula на SQL вместо HQL Hibernate, он жалуется, что GROUPPARTICIPANT0.driverIdentStr является недопустимым идентификатором - думаю, что он пытался извлечь driverIdentStr из GroupParticipant вместо получения значения из Driver (??).

@Column терпит неудачу, я думаю, потому что я не уверен, как сопоставить DRIVER с драйвером. У меня есть в GroupParticipant.

Подводя итог, я не могу понять, как получить GroupParticipant.driverIdentStr, который можно извлечь из присоединения к GroupParticipant.driverId на Driver.id и получения Driver.driverIdentStr.

Любая помощь была бы принята с благодарностью.

ответ

1

Вот что работал ...

@Formula ("(выберите d.DRIVER_IDENT_STR из Возбудитель D, где d.ID = DRIVER_ID)")

я нашел ответ на: http://gokhan.ozar.net/hibernate-derived-properties-formula-annotation под заголовком «Более сложный пример».

Вот что я узнал от чтения и от примера ...

  1. Только SQL в формуле аннотацию (не HQL вообще)
  2. Прежде чем найти в приведенном выше примере, я использовал д. в WHERE, но не в SELECT-части запроса формулы и Hibernate. В этот момент я думал, что Hibernate игнорирует мою аннотацию Формулы и пытается получить значение из первичной таблицы, но она не игнорирует мою Формулу, моя Формула по сути говорила, что она получает значение из первичной таблицы (потому что d. не используется, чтобы сообщить об этом иначе.)

Спасибо!

0

@Formula аннотацию интерпретируется как фрагмент SQL, так что следующее должно работать, если стандартное именование на основе ваших отображений:

@Formula("SELECT driverIdentStr FROM DRIVER WHERE id = driverId") 

Для уточнения:

  1. driverIdentStr это имя столбца в объект Driver, который сопоставляется с этим свойством.
  2. id - это имя столбца первичного ключа в объекте Driver.
  3. driverId - это название колонки в GroupParticipant.
  4. Я использовал явное имя таблицы DRIVER, если ваша база данных чувствительна к регистру.
Смежные вопросы