Выборка соединения с помощью @JoinTable с SQLQuery - PullRequest
1 голос
/ 29 октября 2009

У меня есть сопоставленная сущность со свойством «latestHistory», которая отображается через таблицу соединений, например:

class Record {

  @OneToOne(cascade = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE }, fetch = FetchType.LAZY, optional = true)
  @JoinTable(name = "latest_history_join_view", joinColumns = { @JoinColumn(name = "record_id") }, inverseJoinColumns = { @JoinColumn(name = "history_id") })
  @AccessType("field")
  public History getLatestHistory() { ... }
}

Отображение работает правильно, когда я вызываю myRecord.getLatestHistory ().

У меня сложный собственный SQL-запрос, который возвращает пакет записей и объединяет историю для каждой записи с помощью таблицы соединений.Я хочу вернуть записи Entite из запроса и заполнить объекты History в результате.Моя попытка выглядит следующим образом:

StringBuffer sb = new StringBuffer();
sb.append("select {r.*}, {latestHistory.*}");
sb.append(" from record r");
sb.append(" left join latest_history_join_view lh on lh.record_id = r.record_id");
sb.append(" left join history latestHistory on latestHistory.history_id = lh.history_id");
SQLQuery query = session.createSQLQuery(sb.toString());
query.addEntity("r", Record.class).addJoin("latestHistory", "r.latestHistory");

Когда я делаю это, она генерирует запрос вроде:

select 
   r.record_id, r.name..., 
   r_1.history_id,  --this part is wrong; there is no such alias r_1 
   latestHistory.history_id, latestHistory.update_date, ...
 from record r
 left join latest_history_join_view lh on lh.record_id = r.record_id
 left join history latestHistory on latestHistory.history_id = lh.history_id

Как мне заставить его присоединиться правильно и получить мою ассоциацию, не мешаявверх по списку выбора?

[Обновление: некоторые из подходов, которые я пробовал:

select {r.*}, {latestHistory.*} -> SQL error, generates a wrong column name "r_1.history_id"
select {r.*}, {anyOtherEntityAssociatedToR.*} -> wrong column name (as above)
select {r.*}, {r.history_id}, {latestHistory.*} -> hibernate error, r has no history_id column
select r.*, lh.history_id as history_id -> this works (though hackish), but doesn't accomplish the join
select r.*, lh.history_id as history_id, latestHistory.* -> appears correct, but results in column name collisions
select r.*, {latestHistory.*} -> error when hibernate looks for a nonexistent column in the result set (this happens if there is any alias at all in the select list)

Кажется, не имеет большого значения, использую ли я addEntity (...) или addJoin (...) до тех пор, пока самая левая (корневая) сущность добавляется с помощью addEntity.

]

1 Ответ

1 голос
/ 29 октября 2009

Я думаю, вам действительно нужно указать полный путь для вашего latestHistory в select например.

select {r.*}, {r.latestHistory.*}

в противном случае Hibernate запутывается и пытается рассматривать его как отдельную сущность. Другой вариант - вообще не указывать введенные псевдонимы в select, которые должны работать для одного отношения «один к одному» , если порядок столбцов в ваших таблицах соответствует порядку свойств в ваших сущностях.

Я никогда не пробовал это на @OneToOne поверх таблицы ассоциаций.

...