Hibernate Entity с @ElementCollection и @CollectionTable. Hibernate добавить имя атрибута в оператор SQL при получении коллекции - PullRequest
1 голос
/ 12 октября 2019

В моем случае у меня есть две таблицы: родительский 'VDI_DICT_EMPOYEES_SV' и chield 'VDI_DICT_EMPOYEES_RV', объединенные столбцом с тем же именем 'R_OBJECT_ID'. (См. Диаграмму ER)

enter image description here

Структура родительского объекта:

@Entity
@Table(name="VDI_DICT_EMPLOYEE_SV")
public class DmDictEmployee {
  @Column (name="R_OBJECT_ID") private String objectId;

... other columns are skipped...

  @ElementCollection
  @CollectionTable(name="VDI_EMPLOYEE_RV, joinColumns=@JoinColumn(name="CROC_SECRETARY_ID",referencedColumnName="R_OBJECT_ID"))
 private List<String> crocSecretaryIds; // the element collection

... getters and setters are skipped too...

}

Для извлечения мастера иведомые данные я использую нативный @Query

"SELECT parent.*, chield.CROC_SECRETARY_ID from VDI_DICT_EMPLOYEE_SV parent left outer join VDI_DICT_EMPLOYEE_RV chield on parent.R_OBJECT_ID=chield.R_OBJECT_ID"

(при этом выбирается запись сотрудника со списком секретарей в одном окне выбора)

И все работает нормально, как я вижу из журнала. Запрос возвращает данные просто отлично. Но когда я пытаюсь получить список crocSecretaryIds, я вижу, что HIBERNATE готовит SQL, который включает имя коллекции: "SELECT CROC_SECRETARY_ID, crocSecretaryIds FROM VDI_DICT_EMPLOYEES_RV WHERE R_OBJECT_ID =) ... *

enter image description here

, что довольно странно. Я ожидал увидеть SQL-запрос без crocSecretaryIds , поэтому я предполагаю, что что-то не так с моим объявлением столбца @ElementCollection. Не могли бы вы посоветовать какие-либо идеи о том, что пропущено и почему HIBERNATE готовит запрос с crocSecretaryIds ?

1 Ответ

1 голос
/ 14 октября 2019

Наконец я понял, что неправильно сослался на таблицу «child». Вместо

@ElementCollection
@CollectionTable(name="VDI_EMPLOYEE_RV, joinColumns=@JoinColumn(name="CROC_SECRETARY_ID",referencedColumnName="R_OBJECT_ID"))
 private List<String> crocSecretaryIds; // the element collection

мне нужно сделать:

@ElementCollection
@CollectionTable(name="VDI_EMPLOYEE_RV, joinColumns=@JoinColumn(name="R_OBJECT_ID",referencedColumnName="R_OBJECT_ID"))
@Column(name="CROC_SECRETARY_ID") // the column name in child table
private List<String> crocSecretaryIds; 

Итак, теперь это работает.

...