Проблема
Я хочу сохранить только имя пользователя в журнале событий, но хотел бы, чтобы Hibernate загружал весь объект пользователя (имя, фамилия, имя пользователя и т. д.) при получении записи EventChangeLog. Однако у меня возникают проблемы с сопоставлением пользователя с моим классом EventChangeLog, если я не использую конструктор в своем запросе HQL.
Вот с чем я работаю:
Класс EventChangeLog
Код: Выделить всё
@NoArgsConstructor
@Getter
@Setter
public class EventChangeLog {
private long id;
private Event event;
private String createdByUsername;
private User createdBy;
// Constructor initializes all fields except `id`
}
Код: Выделить всё
eventchangelog_sequence
Код: Выделить всё
@NoArgsConstructor
@Getter
@Setter
public class User {
private String username;
private String surname;
private String firstName;
}
Код: Выделить всё
Код: Выделить всё
When I use this HQL query with a constructor, it maps everything correctly:
String hql = """
select new org.event.EventChangeLog(
ecl.event,
ecl.createdByUsername,
ecl.createdBy
)
from EventChangeLog ecl
join ecl.event e
left join ecl.createdBy
where e.uid = :eventUid
""";
Код: Выделить всё
String hql = """
select ecl
from EventChangeLog ecl
join ecl.event e
left join ecl.createdBy
where e.uid = :eventUid
""";
- Ограничение внешнего ключа: добавление внешнего ключа не помогло не работает из-за бизнес-ограничений.
- Сопоставление первичного ключа: сопоставление по user.id также не работает.
- Eager против ленивой выборки: Оба подхода не изменили результат.
- Использовался CriteriaQuery вместо HQL: тот же результат; Пользователь не получен.
- Журналы гибернации: запрос на соединение кажется правильным и выглядит одинаково в обоих случаях, поэтому я подозреваю, что проблема в конфигурации сопоставления.
Подробнее здесь: https://stackoverflow.com/questions/791 ... constraint
Мобильная версия