Здесь много подобных вопросов, но после долгих поисков я не нашел этот вопрос или ответ на него.
У меня есть объект с @ElementCollection
, отображенным так:
@Entity
public class MyEntity {
...
@ElementCollection(fetch = FetchType.EAGER)
@MapKeyColumn(name = "value")
@Column(name = "description")
private Map<String, String> validValues = new HashMap<>();
@Column
protected Long otherId;
Эта конфигурация работает нормально, я не указал имя для сопоставленной таблицы, но Hibernate создал ее автоматически из сопоставления и назвал ее my_entity_valid_values
. Извлечение этих значений через Hibernate отлично работает для каждого экземпляра MyEntity
, проблема в производительности для больших наборов данных.
В моем приложении я могу иметь большие коллекции MyEntity
объектов, и вместо того, чтобы полагаться на энергичную выборку Hibernate, которая генерирует n
запросов, я бы хотел получить их все самостоятельно. Я пытаюсь это HQL:
select e.id,vv from MyEntity e join e.validValues vv where e.otherId=14
Это приводит к следующему SQL:
select
myentity0_.id as col_0_0_,
validvalue1_.description as col_1_0_
from
my_entity myentity0_
inner join
my_entity_valid_values validvalue1_
on myentity0_.id=validvalue1_.my_entity_id
where
myentity0_.other_id=14
Таблица my_entity_valid_values
, созданная Hibernate, имеет 3 столбца, my_entity_id
, который является внешним ключом к исходной таблице, а также столбцы value
и description
, которые представляют собой два столбца, которые представляют ключи и значения для сопоставления Map<String, String>
.
Однако SQL, сгенерированный из ссылки vv
в HQL, включает только столбец description
, в котором отсутствует столбец value
и отображается неполная картина этих данных. Как получить столбцы value
и description
в этом случае? Я пробовал HQL, например:
select e.id,vv.value,vv.description ...
Но это дает мне org.hibernate.QueryException: cannot dereference scalar collection element
.
Любые советы приветствуются!